再帰関数の例外処理の鍵は、再帰スタックを直ちに巻き戻すことです。これにより、メモリ リークやプログラムのクラッシュが発生する可能性があります。例外を処理する方法には、例外をローカル変数にカプセル化する方法、RAII ラッピングを使用する方法、または std::terminate() を使用して関数を終了する方法が含まれます。たとえば、カプセル化された例外を使用して、階乗を計算する再帰関数で例外を処理できます。 if (n
##C 再帰関数での例外処理再帰関数は、例外が発生すると、再帰スタックが例外を処理するときに特に注意する必要があります。すぐに巻き戻されると、ハンドルされていないローカル変数がすべて破棄され、予期しないメモリ リークやプログラムのクラッシュが発生する可能性があります。
処理方法再帰関数で例外を処理するには、さまざまな方法があります。
1. 例外をローカル変数にカプセル化します // 函数可以抛出 std::runtime_error 异常
void recursive_function(int remaining_depth) {
if (remaining_depth <= 0) {
return;
}
// 封装异常到本地变量中
try {
// 存在异常抛出的代码
...
} catch (const std::runtime_error& e) {
// 对异常进行处理(可选)
}
// 递归调用自身
recursive_function(remaining_depth - 1);
}
RAII (リソース取得は初期化) パッケージを使用すると、例外が発生したときにリソースを自動的に解放できます。カスタム RAII ラッパーを使用すると、再帰関数の引数リスト内のリソースへのポインターを取得し、スコープを終了するときにリソースが解放されることを保証できます。
// RAII 包装器,在析构时释放资源 struct ResourceWrapper { ResourceWrapper() { // 获取资源 } ~ResourceWrapper() { // 释放资源 } }; void recursive_function(int remaining_depth, ResourceWrapper& resources) { if (remaining_depth <= 0) { return; } // 使用资源并处理异常(可选) try { ... } catch (...) { // 处理异常(可选) } // 递归调用自身 recursive_function(remaining_depth - 1, resources); }3. 終了関数を使用する
終了関数を使用すると、例外が発生したときに再帰呼び出しを即座に停止できます。これは、再帰関数内で
std::terminate() 関数を呼び出すことで実現できます。これにより、スタックが巻き戻されてプログラムが終了します。 <pre class='brush:cpp;toolbar:false;'>void recursive_function(int remaining_depth) {
if (remaining_depth <= 0) {
return;
}
// 存在异常抛出的代码
...
// 异常发生时终止程序
std::terminate();
// 递归调用自身
recursive_function(remaining_depth - 1);
}</pre>
数値の階乗を計算するために使用される再帰関数を考えてみましょう:
int factorial(int n) { if (n == 0) { return 1; } else { return n * factorial(n - 1); } }
例外をローカル変数にカプセル化する方法を使用します。 、次のように例外を処理できます:
int factorial(int n) { if (n < 0) { throw std::runtime_error("阶乘不能计算负数"); } if (n == 0) { return 1; } else { return n * factorial(n - 1); } }
以上がC++ 再帰関数で例外を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。