C++ のエラー処理

// 著作権 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[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 値として返します。
  • Result を返すように CXX ブリッジで宣言されていない extern "C++" 関数から例外がスローされた場合、プログラムは C++ の std::terminate を呼び出します。この動作は、同じ例外が noexcept C++ 関数を通してスローされた場合と同等です。