• 作成:

Rustでデフォルトのパニック表示を損なわずにpanic時に行われる処理を増やす

多分みんな知ってそう.

動機

Rustでサーバを書いている時, panicは想定外なので起きたら絶対に気が付きたい.

よってパニックが起きた時はSlackの特定チャンネルに通知を出すことにしました. それで2重パニックになったらもう知らない.

実現メソッド

std::panic::set_hook - Rust でパニック時の処理を書き換えできます.

問題

これを使うだけではデフォルトのパニック処理が消えてしまいます. RUST_BACKTRACE=1時の処理とかを自分で書くのは面倒くさい.

解決策

std::panic::take_hook - Rust でデフォルトのものを取っておけば問題ありません.

use std::panic;

fn main() {
    let default_hook = panic::take_hook();

    panic::set_hook(Box::new(move |panic_info| {
        eprintln!("Custom panic hook: {:?}", panic_info);
        default_hook(panic_info);
    }));

    panic!("Normal panic");
}

改善案

カスタム処理で2重パニックなどが起きた時のことを考えるとカスタムホック部分を後にしたほうが良いかもしれません. 今回は2重パニックは流石に起きないと割り切っているので問題ありませんが…