- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是我的代码。
try
{
// code throws potentially unknown exception
}
catch (...)
{
std::exception_ptr eptr = std::current_exception();
// then what ?
}
理想情况下,如果它是 std::exception,我想获取与异常关联的字符串。
最佳答案
// then what ?
这是什么:
#include <exception>
#include <stdexcept>
#include <iostream>
#include <string>
std::string what(const std::exception_ptr &eptr = std::current_exception())
{
if (!eptr) { throw std::bad_exception(); }
try { std::rethrow_exception(eptr); }
catch (const std::exception &e) { return e.what() ; }
catch (const std::string &e) { return e ; }
catch (const char *e) { return e ; }
catch (...) { return "who knows"; }
}
int main()
{
try { throw std::runtime_error("it's success!"); }
catch (...) { std::cerr << "Here is WHAT happened: " << what() << std::endl; }
try { throw 42; } catch (...) { std::cerr << "and now what: " << what() << std::endl; }
}
打印的内容:
Here is WHAT happened: it's success!
and now what: who knows
http://coliru.stacked-crooked.com/a/1851d2ab9faa3a24
所以这允许在 catch-all 子句中获取 what
。
但是如果异常是嵌套的呢???这是什么:
std::string what(const std::exception_ptr &eptr = std::current_exception());
template <typename T>
std::string nested_what(const T &e)
{
try { std::rethrow_if_nested(e); }
catch (...) { return " (" + what(std::current_exception()) + ")"; }
return {};
}
std::string what(const std::exception_ptr &eptr)
{
if (!eptr) { throw std::bad_exception(); }
try { std::rethrow_exception(eptr); }
catch (const std::exception &e) { return e.what() + nested_what(e); }
catch (const std::string &e) { return e ; }
catch (const char *e) { return e ; }
catch (...) { return "who knows"; }
}
使用 here 中的示例:
#include <fstream>
...
// sample function that catches an exception and wraps it in a nested exception
void open_file(const std::string& s)
{
try {
std::ifstream file(s);
file.exceptions(std::ios_base::failbit);
} catch(...) {
std::throw_with_nested( std::runtime_error("Couldn't open " + s) );
}
}
// sample function that catches an exception and wraps it in a nested exception
void run()
{
try {
open_file("nonexistent.file");
} catch(...) {
std::throw_with_nested( std::runtime_error("run() failed") );
}
}
int main()
{
try { throw std::runtime_error("success!"); }
catch (...) { std::cerr << "Here is WHAT happened: \"" << what() << '\"' << std::endl; }
try { run(); }
catch (...) { std::cerr << "what happened for run: \"" << what() << '\"' << std::endl; }
}
打印的内容:
Here is WHAT happened: "success!"
what happened for run: "run() failed (Couldn't open nonexistent.file (basic_ios::clear))"
http://coliru.stacked-crooked.com/a/901a0c19297f02b5
但是如果递归太深怎么办?如果堆栈溢出怎么办?优化了什么:
#include <typeinfo>
template <typename T>
std::exception_ptr get_nested(const T &e)
{
try
{
auto &nested = dynamic_cast<const std::nested_exception&>(e);
return nested.nested_ptr();
}
catch (const std::bad_cast &)
{ return nullptr; }
}
#if 0 // alternative get_nested
std::exception_ptr get_nested()
{
try { throw ; }
catch (const std::nested_exception &e) { return e.nested_ptr(); }
catch (...) { return nullptr ; }
}
#endif
std::string what(std::exception_ptr eptr = std::current_exception())
{
if (!eptr) { throw std::bad_exception(); }
std::string whaaat;
std::size_t num_nested = 0;
next:
{
try
{
std::exception_ptr yeptr;
std::swap(eptr, yeptr);
std::rethrow_exception(yeptr);
}
catch (const std::exception &e) { whaaat += e.what() ; eptr = get_nested(e); }
catch (const std::string &e) { whaaat += e ; }
catch (const char *e) { whaaat += e ; }
catch (...) { whaaat += "who knows"; }
if (eptr) { whaaat += " ("; num_nested++; goto next; }
}
whaaat += std::string(num_nested, ')');
return whaaat;
}
同样的:
Here is WHAT happened: "success!"
here is what: "run() failed (Couldn't open nonexistent.file (basic_ios::clear))"
http://coliru.stacked-crooked.com/a/32ec5af5b1d43453
UPD
可以在 C++03 中通过使用允许在 catch block 之外重新throw
当前异常的技巧来实现类似的功能:https://stackoverflow.com/a/3641809/5447906
关于c++ - 如何调用 std::exception_ptr 上的 what(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232814/
我想使用 boost::promise::set_exception() 需要一个 boost::exception_ptr。问题是 boost:exception_ptr 似乎只有在我用 enabl
在我看来,标准允许 std::exception_ptr 不使用引用计数(即 std::exception_ptr cctor 可以复制异常对象指着)。这意味着 following code可能永远不
以下代码段的行为是否定义明确? std::exception_ptr eptr; try { ... } catch (...) { eptr = std::current_exception
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我有一个工作线程,它通过 std::thread 持续运行、创建和管理。在我的工作线程的顶层,我有一个 try/catch block ,里面有一个 while 循环。如果异常泄漏到线程的顶层,我会捕
给出关于来自 cppreference.com 的 std::exception_ptr 的示例,以下列方式缩短代码是否合法?如果所有处理都在 catch block 内完成,则无需将 std::ex
假设我有一个 std::exception_ptr 实例。我需要检查底层异常是否属于某种类型(理想情况下可以访问它)。可以这样做: std::exception_ptr p = ...; try {
这个问题在这里已经有了答案: Is there any way to get some information at least for catch(...)? (5 个答案) Get some i
我有一个运行异步网络工作线程的系统,并定期检查该工作线程是否存储了一些std::exception_ptr。在这种情况下,它可能会抛出错误,或以其他方式报告错误。简单的例子: #include #i
如果我定义一个异常类 class Exception : public std::runtime_error { /*...*/ private: std::exception_ptr nex
如果我在 std::exception_ptr 中存储了一个异常。我使用 std::rethrow_exception 重新抛出异常,使用 catch(MyException&) 访问它,然后修改值。
可能我不是第一个发现 std::exception_ptr 可用于实现 any 类型(性能考虑被搁置)的人,因为它是可能是 C++ 中唯一可以容纳任何东西的类型。然而,谷歌搜索并没有在这方面带来任何结
这是我的代码。 try { // code throws potentially unknown exception } catch (...) { std::exception_ptr ep
我正在编写一些需要缓存异常的代码。 请考虑 int main() { std::exception_ptr ex; bool b = ex; } 由于 ex 无法转换为 bool 类型
我使用 Visual Studio 2013 (vc12) 和 Boost 1.56.0 创建了一个 Win32 控制台应用程序。 这是我唯一的文件: #define _CRTDBG_MAP_ALLO
我有一个 std::exception_ptr 类型的对象,我想在它上面调用 what(),但似乎没有办法做到这一点(如本答案中所述:How do I make a call to what() on
我有点困惑,但我的问题很简单。 我有一堆线程,我想通过在主线程中处理其他线程发送的所有异常来集中处理错误。 我是否在每个线程的每个 catch 子句中使用全局共享 exception_ptr 并使用
我试图获得对 std::exception 的引用由 std::exception_ptr 持有. 这是我尝试过的: #include using namespace std::literals;
这是如何使用 std::exception_ptr 移动异常的最小代码示例: #include #include #include #include int main() { try
我有一个关于异常生命周期的可移植性问题。在下面的代码中,异常在一个线程 (mySlave) 中抛出并使用 std::exception_ptr 转移到另一个线程 (myMaster) . myMast
我是一名优秀的程序员,十分优秀!