首页 >后端开发 >C++ >如何查明代码中未处理异常的来源?

如何查明代码中未处理异常的来源?

Patricia Arquette
Patricia Arquette原创
2024-11-16 15:33:03402浏览

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

识别未处理异常的来源

在异常处理领域,查明异常根本原因的能力至关重要。虽然在创建异常时包含附加信息相当简单,但确定未处理或外部异常产生的确切代码行可能具有挑战性。

自定义类和宏来救援

一个有效的解决方案是使用自定义异常类和宏。我们可以定义一个自定义异常类 my_exception,它扩展了标准 std::runtime_error。在此类中,我们使用异常的文件名、行号和原始错误消息初始化一条消息。

接下来,我们创建一个宏 throw_line(),它接受一个参数并使用适当的参数抛出 my_exception信息。该宏简化了抛出包含详细错误上下文的异常的过程。

演示:

让我们考虑以下示例代码:

#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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn