如何获得catch-all异常的消息

时间:2010-06-28 13:53:08

标签: c++ visual-c++ exception-handling

如果我想在捕获全部异常的情况下将有用信息写入文件,该怎么做?

try
{
   //call dll from other company
}
catch(...)
{
   //how to write info to file here???????
}

5 个答案:

答案 0 :(得分:53)

您无法从... catch块中获取任何信息。这就是代码通常处理这样的异常的原因:

try
{
    // do stuff that may throw or fail
}
catch(const std::runtime_error& re)
{
    // speciffic handling for runtime_error
    std::cerr << "Runtime error: " << re.what() << std::endl;
}
catch(const std::exception& ex)
{
    // speciffic handling for all exceptions extending std::exception, except
    // std::runtime_error which is handled explicitly
    std::cerr << "Error occurred: " << ex.what() << std::endl;
}
catch(...)
{
    // catch any other errors (that we have no information about)
    std::cerr << "Unknown failure occurred. Possible memory corruption" << std::endl;
}

答案 1 :(得分:10)

函数std :: current_exception()可以访问捕获的异常,该函数在&lt; exception&gt;中定义。这是在C ++ 11中引入的。

std::exception_ptr current_exception();

但是,std :: exception_ptr是一个实现定义的类型,因此无论如何都无法获取详细信息。 typeid(current_exception()).name()告诉你exception_ptr,而不是包含的异常。所以你可以用它做的唯一事情是std :: rethrow_exception()。 (这个函数似乎可以在线程之间标准化catch-pass-and-rethrow。)

答案 2 :(得分:6)

无法在catch-all处理程序中了解有关特定异常的任何信息。如果可以捕获基类异常,最好是std :: exception,如果可能的话。

答案 3 :(得分:3)

您无法获得任何详细信息。 catch(...)的重点是要有这样的“我不知道会发生什么,所以抓住任何被抛出的东西”。您通常会在catch(...)之后将catch放置在已知的异常类型中。

答案 4 :(得分:1)

我认为他想让它记录发生错误,但并不特别需要确切的错误(在这种情况下他会编写自己的错误文本)。

上面发布的DumbCoder链接在教程中将帮助您获得您想要实现的目标。