如果我想在捕获全部异常的情况下将有用信息写入文件,该怎么做?
try
{
//call dll from other company
}
catch(...)
{
//how to write info to file here???????
}
答案 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链接在教程中将帮助您获得您想要实现的目标。