C++のエラー処理

#[cxx::bridge]
mod ffi {
    unsafe extern "C++" {
        include!("example/include/example.h");
        fn fallible(depth: usize) -> Result<String>;
    }
}

fn main() {
    if let Err(err) = ffi::fallible(99) {
        eprintln!("Error: {}", err);
        process::exit(1);
    }
}
  • Result を返すように宣言された C++ 関数は、C++ 側でスローされたあらゆる例外をキャッチし、呼び出し元の Rust 関数に Err 値として返します。
  • CXX ブリッジでResultを返すように宣言されていないextern "C++"関数から例外がスローされると、Resultが返されると、プログラムは C++ のstd::terminateを呼び出します。この動作は、同じ例外がnoexcept C++ 関数でスローされた場合と同等です。