如何在C++程序中获取错误行号

CHA*_*KRI 12 c++ exception line

我想处理我的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
  }

}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我只能获得LINE B编号,但我想获得LINE A和LINE C编号.

任何想法,在哪里以及如何使用LINE宏?

谢谢.

650*_*502 8

您正在寻找堆栈跟踪,并且没有可移植的方式来获取它.可以通过以下方式实现类似的功能:

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__);
Run Code Online (Sandbox Code Playgroud)

然后在每个函数(或兴趣点)开始之后,您只需添加一行......例如

int myFunction(int x)
{
    MARK_FUNCTION
    ...
}
Run Code Online (Sandbox Code Playgroud)

在错误处理程序中使用此方法,您可以知道谁由谁调用等等(当然您只知道已使用MARK_FUNCTION检测的函数或位置).如果仅在测试期间(而非生产中)需要这样做,那么您可能应该只启用核心转储并学习如何在事后分析中运行调试器.