C++ catch(std::exception & e ) vs. catch(...)
C++ catch(std::exception & e ) vs. catch(...)
我知道这两个捕获的处理差异,但是椭圆需要什么才能捕获std::exception catch无法捕获的内容?
例如:
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++常见问题解答中阅读有用的内容:我应该扔什么?
如前所述,throw
语句抛出一个类型派生自 std::exception
的对象,因此它被第一个 catch
子句捕获。如果将抛出更改为 throw 3;
则异常将由第二个 catch
子句捕获,而不是第一个子句。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- 为什么catch中的代码没有被执行
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- catch框架有没有办法比较流或文件
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 从 Rcpp Catch 测试中获取有关"inst/extdata"的数据
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- C++ catch(std::exception & e ) vs. catch(...)
- Try/Catch VS在C++中返回错误代码