我想处理我的 c++ 程序中的错误,所以我创建了一些异常类来管理这些错误,但我想指定错误发生在程序的哪一行。
我将 LINE 宏传递给我的异常类的构造函数。
例如:
void f(int i){ // LINE A
if(i<0)
throw(OutOfRange("message", __LINE__); // LINE B
}
void main(){
try{
f(-6); // LINE C
}
catch(const OutOfRange& error){
//do something
}
}
在这个例子中我只能得到 LINE B 的号码,但我想得到 LINE A 和 LINE C 的号码。
任何想法,在哪里以及如何使用 LINE 宏??
谢谢。
最佳答案
您正在寻找堆栈跟踪,但没有可移植的方法来获取它。可以通过以下方式实现一些类似的东西:
struct SourcePoint
{
const char *filename;
int line;
SourcePoint(const char *filename, int line)
: filename(filename), line(line)
{ }
};
std::vector<SourcePoint> callstack;
struct SourcePointMarker
{
SourcePointMarker(const char *filename, int line)
{
callstack.push_back(SourcePoint(filename, line);
}
~SourcePointMarker()
{
callstack.pop_back();
}
}
#define MARK_FUNCTION \
SourcePointMarker sourcepointmarker(__FILE__, __LINE__);
然后在每个功能(或兴趣点)开始之后,您只需添加一行...例如
int myFunction(int x)
{
MARK_FUNCTION
...
}
在您的错误处理程序中使用这种方法,您可以知道谁被谁调用等等(当然,您只会知道已使用 MARK_FUNCTION 检测的函数或位置)。如果仅在测试期间(而不是在生产中)需要这样做,那么您可能应该只启用核心转储并学习如何在事后分析中运行调试器。
关于c++ - 如何在 C++ 程序中获取错误行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4562135/