C 例外処理メカニズムとコード例
C プログラミングでは、例外処理メカニズムは非常に重要な概念であり、実行時エラーや予期せぬ状況に対処し、プログラムの堅牢性と信頼性を高めるのに役立ちます。この記事では、例外定義、例外のスロー、例外のキャッチ、例外ハンドラなどを含む C の例外処理メカニズムを紹介し、読者の理解と応用に役立ついくつかのコード例を提供します。
1. 例外の定義
プログラムの通常の実行中に、処理できないエラーや予期しない状況が発生した場合、例外が発生します。例外は、プログラムの安全性と信頼性を確保するために、プログラム内でエラーが発生したときにエラー情報を提供し、プログラムを正常に終了できるプログラムの保護メカニズムとして理解できます。
C は、std::Exception、std::bad_alloc、std::runtime_error など、さまざまな種類の例外を表すいくつかの標準例外クラスを定義します。例外クラスをカスタマイズして、特定の例外を表すこともできます。
2. 例外のスロー
プログラム内で例外が発生した場合、 throw キーワードを使用して例外をスローし、例外オブジェクトを例外ハンドラーに渡すことができます。通常、例外をスローするための構文は次のとおりです。
throw exceptionType(argument);
このうち、ExceptionType は例外クラスの型、argument は例外オブジェクトのパラメーターであり、任意の型のデータを指定できます。
以下は、標準例外クラス std::runtime_error をスローし、エラー メッセージをパラメータとして渡す方法を示す簡単なコード例です。
#include <iostream> #include <stdexcept> void division(int a, int b){ if (b == 0){ throw std::runtime_error("Division by zero"); } std::cout << "Result: " << a/b << std::endl; } int main(){ try{ division(10, 0); } catch(std::exception& e){ std::cout << "Exception caught: " << e.what() << std::endl; } return 0; }
上記のコードでは、除数がが 0 の場合、プログラムは std::runtime_error 例外をスローし、エラー メッセージ文字列をパラメータとして渡します。 main 関数では、try-catch ステートメントを使用してこの例外をキャッチし、例外エラー メッセージを出力します。
3. 例外のキャッチ
プログラムが例外をスローした場合、プログラムのクラッシュを避けるために、例外をキャッチして処理する必要があります。 try-catch ステートメントを使用して例外をキャッチできます。構文は次のとおりです:
try{ // 可能抛出异常的代码 } catch(exceptionType1& e1){ // 处理类型为exceptionType1的异常 } catch(exceptionType2& e2){ // 处理类型为exceptionType2的异常 } catch(...){ // 处理所有类型的异常 }
try ステートメント ブロックには、例外をスローする可能性のあるコードを含めることができます。プログラムが例外をスローすると、try ステートメント ブロックから飛び出し、対応する catch ステートメント ブロックに入り、例外の種類と catch ステートメントの一致に基づいて処理が行われます。最後の catch ステートメント、catch(...) は、あらゆるタイプの例外を処理できますが、例外オブジェクトに関する情報が失われ、プログラムのデバッグやメンテナンスに不便であるため、その使用はお勧めできません。
以下は、std::runtime_error 例外をキャッチして処理する方法を示す簡単なコード例です。
#include <iostream> #include <stdexcept> void division(int a, int b){ if (b == 0){ throw std::runtime_error("Division by zero"); } std::cout << "Result: " << a/b << std::endl; } int main(){ try{ division(10, 0); } catch(std::runtime_error& e){ std::cout << "Exception caught: " << e.what() << std::endl; } return 0; }
上記のコードでは、除数が 0 の場合、プログラムはstd::runtime_error 例外。 main 関数では、try-catch ステートメントを使用してこの例外をキャッチし、例外エラー メッセージを出力します。
4. 例外ハンドラー
try-catch ステートメントに加えて、C には、例外ハンドラーと呼ばれる、キャッチされなかった例外を処理するための特別なメカニズムも用意されています。 std::set_terminate() 関数を使用すると、例外ハンドラーを登録し、プログラム内でキャッチされない例外が発生したときにハンドラー コードを実行できます。例外ハンドラーは通常、メモリ不足、ファイルの読み取りおよび書き込みエラーなどの重大なエラーを処理するために使用されます。
以下は、例外ハンドラーを登録して使用する方法を示す簡単なコード例です:
#include <iostream> #include <cstdlib> void myExceptionHandler(){ std::cout << "Unhandled exception" << std::endl; std::exit(1); } int main(){ std::set_terminate(myExceptionHandler); int* p = new int[1000000000]; delete[] p; return 0; }
上記のコードでは、std::set_terminate() 関数を使用して例外を登録します。ハンドラーは myExceptionHandler を実装し、main 関数に大きなメモリ ブロックを割り当てます。メモリが不足しているため、プログラムは std::bad_alloc 例外をスローします。この例外は myExceptionHandler プロセッサによってキャッチされ、エラー メッセージが出力されてプログラムが終了します。
概要
C 例外処理メカニズムはプログラムの非常に重要な部分であり、実行時エラーや予期せぬ状況に対処するのに役立ち、プログラムの堅牢性と信頼性を高めます。この記事では、C での例外定義、例外のスロー、例外のキャッチ、例外ハンドラーなどを紹介し、読者がそれらをよりよく理解して適用できるようにいくつかのコード例を示します。実際のプログラミングでは、プログラムの効率性と保守性を確保するために、例外処理メカニズムを合理的に使用し、乱用や誤用を回避する必要があります。
以上がC++ 例外処理メカニズムとコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。