例外安全性
例外安全なコードを記述します
「例外安全性」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
例外安全性とは
例外安全性とは、処理の途中で例外が発生したときに、コードがどのような保証を維持するかを表します。
no-throw保証
最も強いレベルです。操作が決して例外を発生させません。デストラクタ、swap、ムーブ操作はこれを目指し、noexceptを付けるべきです。
強い保証
操作が例外を発生させた場合でも、処理を開始しなかったかのようにプログラムの状態がロールバックされます。これはコミットまたはロールバックという意味論です。
基本保証
操作が例外を発生させても、リソースリークは発生せず、すべての不変条件が維持されます。ただし、正確な状態は変化している可能性があります。
保証なし
最も弱い保証です。例外によって、プログラムが壊れた状態やリソースリークが発生した状態になる可能性があります。このようなコードは避けてください。
RAIIが基本保証を提供する
リソースをRAIIオブジェクトでラップすると、スタックの巻き戻しによって自動的に解放されるため、ほとんど追加の労力なしで基本保証を得られます。
#include <memory>
#include <stdexcept>
void process() {
auto buf = std::make_unique<int[]>(100); // freed even if throw
throw std::runtime_error("oops"); // no leak
}強い安全性のためのコピーアンドスワップ
一般的な手法は、リスクのある処理をすべてコピー上で行い、その後swapすることです。swapは例外を発生させないため、変更を一括で適用できます。
void assign(Widget& target, const Widget& src) {
Widget tmp = src; // may throw, target untouched
using std::swap;
swap(target, tmp); // no-throw commit
}コミットを最後にする順序で処理する
例外を発生させる可能性がある操作は、取り消せない変更より前にすべて実行してください。共有状態の変更を始めたら、失敗しないようにするべきです。
部分的な更新に注意する
2つのメンバーを更新し、2つ目の更新で例外が発生すると、オブジェクトが不整合な状態になります。両方を準備してから、例外を発生させない手順で同時にコミットしてください。
デストラクタは例外を発生させない
巻き戻し中にデストラクタが例外を発生させると、std::terminateが呼び出されます。安全性の保証を維持するため、デストラクタでは例外を発生させないでください。
保証の選択
可能な場合は強い保証を目指し、常に少なくとも基本保証を提供してください。本当に例外を発生させない操作にはnoexceptを付けます。
クイックチェック
例外安全性の理解度を確認しましょう。
まとめ
例外安全性の4つのレベル、no-throw、強い保証、基本保証、保証なしについて学びました。RAIIは基本保証を自動的に提供し、コピーアンドスワップと最後にコミットする手法は強い保証を提供します。デストラクタとswapでは例外を発生させないでください。
よくある質問
「例外安全性」レッスンは無料ですか?
はい。「例外安全性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「例外安全性」で何を学びますか?
例外安全なコードを記述します ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「例外安全性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。