C++:
エラー処理

方法:

例外を扱う基本的なtry-catchブロックは次の通りです:

#include <iostream>
#include <stdexcept>

int main() {
    try {
        throw std::runtime_error("おっと!何かがうまくいきませんでした。");
    } catch (const std::exception& e) {
        std::cerr << "エラー:" << e.what() << std::endl;
    }
    return 0;
}

サンプル出力:

エラー:おっと!何かがうまくいきませんでした。

深堀り

C++は初期段階からエラー処理を持っていました。最も基本的な形式は、戻り値をチェックすることでした。古参のプログラマなら、標準化以前のC言語にクラスを追加した時代、手動でのエラーチェックを覚えているでしょう。

そして、予期しない問題を扱うための構造化された方法として、C++に例外処理が追加されました。「throw」で例外を投げ、try/catchで捕まえます。

しばしば発生するエラーのタイプには、計算が間違っているような論理エラー、無効なメモリアドレスにアクセスするような実行時エラーがあります。例外は実行時エラーに最適です。論理エラーについては、アサーションやエラーコードを使用する方がしばしば適しています。

例外とエラーコードについては、現在も議論が続いています。例外は遅くなる可能性があり、複雑なコントロールフローを引き起こすかもしれません。エラーコードは、速いですが、コードがごちゃごちゃして保守が難しくなる可能性があります。トレードオフなので、使用する場合のコンテキストを知ることが重要です。

C++17ではstd::optionalstd::variantが導入されました。これらは例外に代わる選択肢であり、有効な結果を返すかもしれないし返さないかもしれない関数に役立ちます。

例外安全性も別の頭痛の種です。それは例外にもかかわらずコードが提供する保証についてです。基本、強、nothrowの3つのレベルがあります。保証が多くなるほど、コードは複雑になるかもしれません。

最終的な考えとして、エラー処理は科学と同じくらい芸術です。それはあなたのアプリケーションが野生で生き残る方法を形作ります。例外を使い過ぎないでください。読みやすく、保守可能なコードを目指しましょう。

参考文献