首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何知道导致异常的确切代码行?

如何知道导致异常的确切代码行?
EN

Stack Overflow用户
提问于 2008-12-08 07:09:27
回答 9查看 45.9K关注 0票数 47

如果我自己生成一个异常,我可以在异常中包含任何信息:一些代码行和源文件的名称。如下所示:

代码语言:javascript
复制
throw std::exception("myFile.cpp:255");

但是,未处理的异常或不是由我生成的异常又有什么关系呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-12-08 18:23:06

似乎每个人都在试图改进你的代码,以便在你的代码中抛出异常,而没有人尝试你提出的实际问题。

这是因为这是不可能的。如果抛出异常的代码只以二进制形式出现(例如,在LIB或DLL文件中),那么行号就没有了,并且没有办法将对象连接到源代码中的一行。

票数 34
EN

Stack Overflow用户

发布于 2008-12-08 07:38:46

更好的解决方案是使用自定义类和宏。:-)

代码语言:javascript
复制
#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;
    }
}
票数 42
EN

Stack Overflow用户

发布于 2008-12-08 07:18:27

最简单的解决方案是使用宏:

代码语言:javascript
复制
#define throw_line(msg) \
    throw std::exception(msg " " __FILE__ ":" __LINE__)

void f() {
    throw_line("Oh no!");
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/348833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档