try、catch、throw
例外でエラーを処理します
「try、catch、throw」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
throw によるエラー通知
throw文は例外を発生させ、現在の処理経路を中断して、呼び出しスタックをさかのぼりながらハンドラを探します。
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::runtime_error("boom");
} catch (const std::exception& e) {
std::cout << e.what() << "\n";
}
}try と catch
例外を発生させる可能性があるコードはtryブロックに記述し、それに対応するハンドラをcatchブロックに続けて記述します。
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) throw std::invalid_argument("divide by zero");
return a / b;
}
int main() {
try {
std::cout << divide(10, 0) << "\n";
} catch (const std::invalid_argument& e) {
std::cout << "error: " << e.what() << "\n";
}
}const 参照でキャッチする
例外は必ずconst&でキャッチしてください。値でキャッチすると派生例外がスライスされ、不要なコピーも発生します。
複数の catch ブロック
ハンドラは、最も具体的なものから最も一般的なものの順に並べてください。最初に一致したブロックが実行されます。
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::out_of_range("bad index");
} catch (const std::out_of_range& e) {
std::cout << "range: " << e.what() << "\n";
} catch (const std::exception& e) {
std::cout << "other: " << e.what() << "\n";
}
}スタックの巻き戻し
例外が発生すると、スタックが巻き戻されます。throwからハンドラまでの間にあるすべてのローカルオブジェクトが、逆の順序で破棄されます。
#include <iostream>
#include <stdexcept>
struct Trace {
~Trace() { std::cout << "unwound\n"; }
};
void f() {
Trace t;
throw std::runtime_error("x");
}
int main() {
try { f(); } catch (...) { std::cout << "caught\n"; }
}全捕捉ハンドラ
catch (...)ブロックは、あらゆる型の例外を捕捉します。通常はログを記録して再throwする場合などに限り、慎重に使用してください。
再throw
ハンドラ内で空のthrow;を使うと、現在の例外を再throwできます。型が保持されるため、外側のハンドラで処理できます。
#include <iostream>
#include <stdexcept>
void inner() { throw std::runtime_error("deep"); }
void middle() {
try { inner(); }
catch (...) { std::cout << "logged\n"; throw; } // rethrow
}
int main() {
try { middle(); } catch (const std::exception& e) { std::cout << e.what() << "\n"; }
}標準例外の階層
標準例外の多くはstd::exceptionを継承しており、what()を公開しています。std::exceptionをキャッチすれば、それらすべてを処理できます。
値でthrowし、参照でcatchする
一時的な例外オブジェクトは値でthrowしてください。ランタイムが安全な領域にコピーします。スライシングを避けるため、参照でcatchしてください。
例外とエラーコード
例外を使うと、正常系とエラー処理を分離でき、戻り値によるエラーコードと違って、エラーを暗黙に無視できません。本当に例外的な状況に限って使用してください。
捕捉されない例外は終了させる
一致するハンドラがない場合、std::terminateが呼び出され、プログラムは中断されます。発生する可能性がある例外は、必ず処理してください。
クイックチェック
例外処理の理解度を確認しましょう。
まとめ
throwでエラーを発生させ、try/catchで処理する方法と、途中でローカルオブジェクトを破棄するスタックの巻き戻しについて学びました。const&でcatchし、ハンドラを具体的なものから一般的なものの順に並べ、空のthrow;で再throwしてください。
よくある質問
「try、catch、throw」レッスンは無料ですか?
はい。「try、catch、throw」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「try、catch、throw」で何を学びますか?
例外でエラーを処理します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「try、catch、throw」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- try、catch、throw
- 例外安全性
- noexcept指定子
- カスタム例外型