[英]C++ catch(std::exception & e ) vs. catch(...)
我知道处理这两个捕获的区别,但是椭圆捕获 std::exception 捕获不会捕获的东西需要什么?
例如:
try
{
throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
std::cout << "Exception: " << e;
}
catch(...)
{
std::cout << "How did I get here?";
throw;
}
我已经看到将这两种方法结合使用的代码示例,但我没有看到您同时使用这两种方法的理由。
catch(const std::exception& e)
只会捕获 std 异常。
catch(...)
之后会抓住一切。
您可以处理整数和其他类型( http://www.cplusplus.com/doc/tutorial/exceptions/ )
例如:
catch(int e)
虽然它绝对是一个好主意,这样做,你就不必从派生自定义异常std::exception
。 C++ 允许您抛出几乎任何对象类型。
所以throw 1;
例如,不会由您的第一个处理程序处理。 而且也不会...
class MyCustomException { // Doesn't derive
///
};
...如果它被抛出。
你可能的意思是:
throw std::runtime_error("runtime error!"); // not std::runtime
std::runtime_error派生自std::exception ,因此您的第一个 catch 块在捕获std::exception
类型的异常时被触发。 你可能的意思是:
std::cout << "Exception: " << e.what(); // not e
如果您抛出std::run_time
或std::exception
及其派生类以外的任何其他内容,则将触发第二个catch
块。 来自 C++ FAQ 的有用阅读:我应该抛出什么?
正如所写, throw
语句抛出一个类型派生自std::exception
的对象,因此它被第一个catch
子句catch
。 如果你把投掷改为throw 3;
异常将被第二个catch
子句catch
,而不是第一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.