当我的应用程序中发生未捕获的异常时,我可以what()
通过向catch
我的main()
函数添加全局来获取异常的字符串,例如:
catch (std::exception& ex)
{
std::cerr << "Error: " << ex.what() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我还可以通过调用backtrace()
和处理程序backtrace_symbol()
内部std::terminate()
(通过调用设置std::set_terminate()
)获取抛出异常的位置的堆栈跟踪.例如(忽略内存泄漏):
void terminate_handler()
{
void** buffer = new void*[15];
int count = backtrace(buffer, 15);
backtrace_symbols_fd(buffer, count, STDERR_FILENO);
}
…
std::set_terminate(terminate_handler);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试通过throw;
在我的全局中重新使用异常来组合这两种方法时catch
,我得到了堆栈跟踪,而catch
不是最初抛出异常的位置.
有什么方法可以同时执行这两种操作(获取最初抛出异常的位置的堆栈跟踪并同时获取其值what()
)?
这应该有效:
void terminate_handler()
{
void** buffer = new void*[15];
int count = backtrace(buffer, 15);
backtrace_symbols_fd(buffer, count, STDERR_FILENO);
//etc.
auto ptr = std::current_exception();
try { std::rethrow_exception(ptr); }
catch (std::exception & p) { std::cout << p.what() << std::endl;}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
511 次 |
最近记录: |