如果我自己生成一个异常,我可以在异常中包含任何信息:一些代码行和源文件的名称。如下所示:
throw std::exception("myFile.cpp:255");
但是,未处理的异常或不是由我生成的异常又有什么关系呢?
发布于 2008-12-08 18:23:06
似乎每个人都在试图改进你的代码,以便在你的代码中抛出异常,而没有人尝试你提出的实际问题。
这是因为这是不可能的。如果抛出异常的代码只以二进制形式出现(例如,在LIB或DLL文件中),那么行号就没有了,并且没有办法将对象连接到源代码中的一行。
发布于 2008-12-08 07:38:46
更好的解决方案是使用自定义类和宏。:-)
#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;
}
}
发布于 2008-12-08 07:18:27
最简单的解决方案是使用宏:
#define throw_line(msg) \
throw std::exception(msg " " __FILE__ ":" __LINE__)
void f() {
throw_line("Oh no!");
}
https://stackoverflow.com/questions/348833
复制相似问题