ホームページ  >  記事  >  バックエンド開発  >  C でハンドルされない例外の正確なソースを特定するにはどうすればよいですか?

C でハンドルされない例外の正確なソースを特定するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-18 12:18:02747ブラウズ

How Can I Identify the Exact Source of Unhandled Exceptions in C  ?

未処理例外の正確なソースの特定

プログラミングでは、通常の実行フローを中断する例外を引き起こす例外的な状況が頻繁に発生します。意図的に生成した例外の原因を特定するのは一般に簡単ですが、未処理の例外や外部システムによって生成された例外の原因を追跡するのは困難な場合があります。

1 つのアプローチは、例外の組み込み情報に依存することです。これには、エラーの原因となる行およびソース ファイルへのポインタが含まれる場合があります。ただし、この情報は、すべてのシナリオで常に利用可能または信頼できるわけではありません。

この制限に対処するには、元の例外とソース情報の両方をカプセル化するカスタム例外クラスの利用を検討してください。これにより、包括的かつユーザーフレンドリーな方法で例外を処理し、例外の原因に関する正確な詳細を提供できるようになります。

このようなカスタム例外クラスを実装する方法は次のとおりです。

#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!");
}

次を使用して例外がトリガーされるときこのマクロを使用すると、my_Exception クラスがファイル名や行番号などのソース情報を自動的に保存します。

次に、このカスタム クラスを使用して例外を処理する方法を示します。

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

Byカスタム例外クラスの what() 関数を利用すると、発生元情報を含む詳細なエラー メッセージを取得でき、正確なエラーの診断と解決が可能になります。

以上がC でハンドルされない例外の正確なソースを特定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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