panic! - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# `panic!`

`panic!`マクロはパニックを生成し、スタックの巻き戻しを開始するために使用することができます。巻き戻しの間、ランタイムは、（訳注: panicを起こした）スレッドが 所有権を持つ 全ての資源のデストラクタを呼び出し、メモリ上から解放します。

今回はシングルスレッドのプログラムを実行しているので、`panic!`はプログラムにパニックメッセージを表示させ、exitします。

    // 整数の除法(/)の再実装
    fn division(dividend: i32, divisor: i32) -> i32 {
        if divisor == 0 {
            // ゼロによる除算はパニックを引き起こします。
            panic!("division by zero");
        } else {
            dividend / divisor
        }
    }

    // `main`のタスク
    fn main() {
        // ヒープ上の整数
        let _x = Box::new(0i32);

        // このオペレーションはタスクの失敗を引き起こします。
        division(3, 0);

        println!("This point won't be reached!");

        // `_x`はここに到達する前に破棄されます。
    }

`panic!`がメモリリークを引き起こさないことを確認しましょう。

    $ rustc panic.rs && valgrind ./panic
    ==4401== Memcheck, a memory error detector
    ==4401== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
    ==4401== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
    ==4401== Command: ./panic
    ==4401==
    thread '<main>' panicked at 'division by zero', panic.rs:5
    ==4401==
    ==4401== HEAP SUMMARY:
    ==4401==     in use at exit: 0 bytes in 0 blocks
    ==4401==   total heap usage: 18 allocs, 18 frees, 1,648 bytes allocated
    ==4401==
    ==4401== All heap blocks were freed -- no leaks are possible
    ==4401==
    ==4401== For counts of detected and suppressed errors, rerun with: -v
    ==4401== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)