ホームページ >バックエンド開発 >C++ >コード内の未処理例外の原因を特定するにはどうすればよいですか?

コード内の未処理例外の原因を特定するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-16 15:33:03406ブラウズ

How can I pinpoint the source of unhandled exceptions in my code?

未処理例外のソースの特定

例外処理の領域では、例外の根本原因を特定する機能が最も重要です。例外を作成するときに追加情報を含めるのは非常に簡単ですが、ハンドルされない例外または外部例外が発生するコード行を正確に判断するのは困難な場合があります。

カスタム クラスとマクロで解決

効果的な解決策の 1 つは、カスタム例外クラスとマクロを使用することです。標準の std::runtime_error を拡張するカスタム例外クラス my_Exception を定義できます。このクラス内で、例外のファイル名、行番号、および元のエラー メッセージを使用してメッセージを初期化します。

次に、引数を受け取り、適切なメソッドを使用して my_Exception をスローするマクロ throw_line() を作成します。情報。このマクロは、詳細なエラー コンテキストを含む例外をスローするプロセスを簡素化します。

デモ:

次のコード例を考えてみましょう:

#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>

class my_exception : public std::runtime_error {
    std::string msg;
public:
    my_exception(const std::string &arg, const char *file, int line) :
    std::runtime_error(arg) {
        std::ostringstream o;
        o << file << ":" << line << ": " << arg;
        msg = o.str();
    }
    ~my_exception() throw() {}
    const char *what() const throw() {
        return msg.c_str();
    }
};
#define throw_line(arg) throw my_exception(arg, __FILE__, __LINE__);

void f() {
    throw_line("Oh no!");
}

int main() {
    try {
        f();
    }
    catch (const std::runtime_error &ex) {
        std::cout << ex.what() << std::endl;
    }
}

このコードを実行すると、出力は次のようになります。

myFile.cpp:20: Oh no!

ご覧のとおり、正確なファイル名、行番号、例外引数を含む詳細なエラー メッセージが表示されます。この情報により、デバッグが大幅に簡素化され、根本原因の効率的な分析が可能になります。

以上がコード内の未処理例外の原因を特定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。