C++ 例外処理ライブラリ <stdexcept>
<stdexcept>は C++ 標準ライブラリ内のヘッダーファイルであり、プログラム実行時のエラー状況を処理するための一連の標準例外クラスを定義しています。
例外とはプログラム実行時に発生するエラーのことで、プログラムが異常終了しないように捕捉して処理することができます。<stdexcept>ヘッダーファイルは、std::exception から派生した一連のstd::exception例外クラスを定義しています。これらのクラスは、エラーを報告および処理する標準的な方法を提供します。
構文
使用するには<stdexcept>内の例外クラスは、まずこのヘッダーファイルをインクルードする必要があります:
#include <stdexcept>
その後、これらの例外クラスを使用して例外をスローおよびキャッチできます。例:
throw std::runtime_error("An error occurred");
例外クラス
<stdexcept>このヘッダーファイルは以下の例外クラスを定義しています:
std::exception:すべての標準例外クラスの基底クラス。std::bad_exception:例外処理中にエラーが発生したときにスローされます。std::bad_alloc:メモリ割り当てに失敗したときにスローされます。std::bad_cast:型変換に失敗したときにスローされます。std::bad_typeid:〜のtypeid操作に失敗したときにスローされます。std::logic_error:論理エラーが発生したときにスローされます。例:無効な入力パラメータ。std::domain_error:関数呼び出しのパラメータが有効範囲内にないときにスローされます。std::invalid_argument:関数呼び出しのパラメータが無効なときにスローされます。std::length_error:コンテナ操作が長さ制限のために失敗したときにスローされます。std::out_of_range:コンテナの不正なインデックスにアクセスしたときにスローされます。std::overflow_error:算術演算がオーバーフローを引き起こしたときにスローされます。std::range_error:関数の戻り値が期待される範囲内にないときにスローされます。std::underflow_error:算術演算がアンダーフローを引き起こしたときにスローされます。
例
以下は、<stdexcept>を使用した簡単な例で、例外のスローとキャッチの方法を示しています:
例
#include <stdexcept>
void riskyFunction(int x) {
if (x < 0) {
throw std::invalid_argument("Negative value not allowed");
}
std::cout << "Processing " << x << std::endl;
}
int main() {
try {
riskyFunction(-1);
} catch (const std::invalid_argument& e) {
std::cerr << "Caught an exception: " << e.what() << std::endl;
}
return 0;
}
出力結果:
Caught an exception: Negative value not allowed
この例では、riskyFunction関数は渡されたパラメータが負の数かどうかをチェックし、負の場合はstd::invalid_argument例外をスローします。main関数内では、try-catchブロックを使用してこの例外をキャッチし、処理します。
標準例外クラス
std::exception
std::exception はすべての標準例外クラスの基底クラスです。例外を説明する文字列を返す仮想関数 what() を提供します。
例
#include <exception>
int main() {
try {
throw std::exception();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
std::logic_error
std::logic_error は std::exception から派生し、プログラムの論理エラーを表します。これは抽象基底クラスであり、通常は派生クラスによって具体化されます。
例
#include <stdexcept>
int main() {
try {
throw std::logic_error("Logic error occurred");
} catch (const std::logic_error& e) {
std::cout << "Caught logic error: " << e.what() << std::endl;
}
return 0;
}
std::invalid_argument
std::invalid_argument は std::logic_error から派生し、無効な引数が渡されたことを表します。
例
#include <stdexcept>
int main() {
try {
throw std::invalid_argument("Invalid argument provided");
} catch (const std::invalid_argument& e) {
std::cout << "Caught invalid argument: " << e.what() << std::endl;
}
return 0;
}
std::domain_error
std::domain_error は std::logic_error から派生し、引数が有効範囲を超えたことを表します。
例
#include <stdexcept>
int main() {
try {
throw std::domain_error("Domain error occurred");
} catch (const std::domain_error& e) {
std::cout << "Caught domain error: " << e.what() << std::endl;
}
return 0;
}
std::length_error
std::length_error は std::logic_error から派生し、コンテナ操作で最大長の制限を超えるなどの長さエラーを表します。
例
#include <stdexcept>
int main() {
try {
throw std::length_error("Length error occurred");
} catch (const std::length_error& e) {
std::cout << "Caught length error: " << e.what() << std::endl;
}
return 0;
}
std::out_of_range
std::out_of_range は std::logic_error から派生し、アクセスが有効範囲を超えたことを表します。
例
#include <stdexcept>
int main() {
try {
throw std::out_of_range("Out of range error occurred");
} catch (const std::out_of_range& e) {
std::cout << "Caught out of range error: " << e.what() << std::endl;
}
return 0;
}
std::runtime_error
std::runtime_error は std::exception から派生し、プログラムの実行時エラーを表します。これは抽象基底クラスであり、通常は派生クラスによって具体化されます。
例
#include <stdexcept>
int main() {
try {
throw std::runtime_error("Runtime error occurred");
} catch (const std::runtime_error& e) {
std::cout << "Caught runtime error: " << e.what() << std::endl;
}
return 0;
}
std::range_error
std::range_error は std::runtime_error から派生し、計算結果が表現範囲を超えたことを表します。
例
#include <stdexcept>
int main() {
try {
throw std::range_error("Range error occurred");
} catch (const std::range_error& e) {
std::cout << "Caught range error: " << e.what() << std::endl;
}
return 0;
}
std::overflow_error
std::overflow_error は std::runtime_error から派生し、算術オーバーフローエラーを表します。
例
#include <stdexcept>
int main() {
try {
throw std::overflow_error("Overflow error occurred");
} catch (const std::overflow_error& e) {
std::cout << "Caught overflow error: " << e.what() << std::endl;
}
return 0;
}
std::underflow_error
std::underflow_error は std::runtime_error から派生し、算術アンダーフローエラーを表します。
例
#include <stdexcept>
int main() {
try {
throw std::underflow_error("Underflow error occurred");
} catch (const std::underflow_error& e) {
std::cout << "Caught underflow error: " << e.what() << std::endl;
}
return 0;
}
カスタム例外クラスの使用
標準例外クラスに加えて、標準例外クラスを継承した独自の例外クラスを定義することもできます。
例
#include <stdexcept>
class MyException : public std::runtime_error {
public:
MyException(const std::string& message) : std::runtime_error(message) {}
};
int main() {
try {
throw MyException("My custom exception occurred");
} catch (const MyException& e) {
std::cout << "Caught custom exception: " << e.what() << std::endl;
}
return 0;
}
<stdexcept>は C++ 標準ライブラリの重要な構成要素であり、一連の標準例外クラスを提供することで、エラー処理をより一貫性があり予測可能なものにしています。これらの例外クラスを使用することで、より堅牢で保守しやすいコードを記述できます。初心者にとって、例外の基本概念と<stdexcept>内の例外クラスの使用方法を理解することは非常に重要です。