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

标签 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
  }

}

在这个例子中我只能得到 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/

相关文章:

java - 计算与二维多边形相交的线段的长度

c# - C# 中泛型类型的缺点

c++ - 使用复制构造函数进行 = 重载

c++ - placement new 运算符的问题

c++ - 将异常规范松散错误视为警告的 Clang 编译器选项

python - 在 python 中检索双重引发的异常原始堆栈跟踪

c++ - std::exception_ptr 线程安全吗?

javascript - 线的第一个坐标 (x0,y0) 不影响 SVG 中的起始位置

c++ - Qt C++ MySQL 到 QTableView 多个连接表为空

Delphi调试器-发生异常时转到行