如何让C++像Python那样给出详细的异常信息?

2024-10-01 19:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,当发生异常时,我可以获得关于哪个文件引发错误的详细信息,即使没有捕获:

def hello():
    raise Exception;

hello() 

Execution result >>

Traceback (most recent call last):
  File "exceptionExample.py", line 4, in <module>
    hello()
  File "exceptionExample.py", line 2, in hello
    raise Exception;
Exception

用C++,信息不是有用的:

^{pr2}$ <>如何使C++给出更详细的信息,说明了什么模块引发了错误,从哪个行?在

我想不用catch子句。在


Tags: 文件inpy信息hellodef错误line
3条回答

您可以创建异常,以便它们在创建时包装堆栈跟踪。仍然请注意只在调试模式下记录此日志,因为记录堆栈跟踪可能是一个安全问题。在

使用调试器也可以帮助您。在

您可以在异常消息中使用__FILE____LINE__定义。在

例如:

#include <stdexcept>

class Error : public std::runtime_error
{
  public:
    Error (const std::string &message)
      : std::runtime_error(message)
    {}

};

int value()
{
    std::stringstream ss;
    ss << "Issues at " << __FILE__ << " on line " << __LINE__;
    throw Error(ss.str());
}

在本例中,我使Error继承自std::runtime_error(它有一个构造函数,允许您以字符串形式传递消息)。。。在

另外,看看这个SO问题:Global Exception Handling-注意关于使用set_terminate函数的答案。这将允许您安装一个全局处理程序,以确保消息按您的需要打印。这里有一些关于set_terminate()的信息。在

Python为未捕获的异常提供堆栈跟踪。我提供的答案只告诉您文件和行号。如果需要堆栈跟踪,一些评论家引用了一些其他问题,这些问题给C++中的建议提供了建议。不过,要小心这个问题的非标准解决方案。在

没有可移植的方法来获取堆栈跟踪,一个诀窍是在函数上下文中使用一个对象来保存信息

struct StackTraceInfo {
    const char *filename;
    int line;
    static std::vector<StackTraceInfo *> stack;
    StackTraceInfo(const char *filename, int line) :
      filename(filename), line(line)
    {
        stack.push_back(this);
    }

    ~StackTraceInfo()
    {
        stack.pop_back();
    } 
};

#define ENTER StackTraceInfo(__FILE__, __LINE__) sinfo_;

in every函数只需在主体的最开始添加一行ENTER

^{pr2}$

如果在抛出之前发生异常,则需要使用globalStackTraceInfo::stackvector的内容保存当前堆栈跟踪,以便显示消息的人可以访问此信息。请注意,您无法访问异常处理程序中的堆栈信息,因为堆栈已在此时展开。在

还请注意,如果应用程序是多线程的,则需要为每个线程使用单独的堆栈,而不是使用全局存储。在

相关问题 更多 >

    热门问题