有没有比使用 catch 更好的方法来查看哪个函数导致了异常

Is there a better way to see which function caused a exception other than using catch

我在定位发生错误的地址时遇到问题,我的整个代码是 运行 在“try”语句中,遗憾的是每当出现问题时我需要使用通过删除我的部分代码来使用旧的尝试和失败方法。有更好的方法吗?

我当前的代码:

try
{
    do
    {
    if (somefunction)

    if (somefunction2)

    if (somefunction3)

    if (somefunction4)
    }
    while (false);
}
catch (...) 
{
    // todo: somehow get the address where the error occurred
    Logger::Log("Exception\n");
}

找出异常来源的一个简单解决方案是在每个函数中使用唯一的消息。捕获异常对象并打印消息。或者甚至可以使用不同类型的异常,如果您想要这样做,它将允许您以不同的方式有效地处理每种情况。


至于获取“地址”,导致当前执行点的函数调用轨迹称为堆栈轨迹(或回溯)。堆栈跟踪将包含地址等信息。目前还没有获得堆栈跟踪的标准方法,尽管它已被提议用于 C++23。

但是,一旦捕获到异常,堆栈就会被“展开”,这样您就不知道异常是从哪里来的。您可以做的是获取可能抛出的代码中的堆栈跟踪(每一个都是因为您不知道哪个是抛出者)并将跟踪存储在异常中。这样做的中心位置是在自定义异常类型的构造函数中。这种模式在现代语言的标准异常处理中很常见。


最后,您不一定需要对程序进行任何更改,如果您改为 运行 调试器中的程序并在抛出时中断,您可以获得所有可能获得的信息.