我正在阅读一篇关于异常的文章,并决定从那里复制代码。这是代码:
int main(int argc, char* argv[]){
try {
throw;
}
catch (...) {
cout << "exception\n";
return 1;
}
cout << "No exeption\n";
return 0;
}
文章说 catch 块应该捕获它,但事实并非如此。为什么?我使用 msvs 2017。还有更多,
int main(int argc, char* argv[]){
int x = 0;
try {
cout << 2 / x;
}
catch (...) {
cout << "exception\n";
return 1;
}
这里也没有捕获“除以 0”类型的异常。为什么?
throw
不带参数确实可以用。它旨在重新引发try-catch
父块中的异常。如果
throw;
在使用的时候没有处理异常(不活跃),那么这样的表达式会抛出std::terminate
.看
扔
没有参数的运算符
throw
只能在处理已捕获的异常时使用。否则,尝试执行throw
不带参数的语句将导致立即调用std::terminate
.http://eel.is/c++draft/expr.throw#4
请注意,“在处理已捕获的异常期间”是运行时特性。也就是说,这样的块
throw
不必在语法上明确地位于try
-block 区域中。这throw
应该只在某些-block 处于活动状态时执行。try
C++ 中没有“除以 0”异常。除以 0 会导致未定义的行为,而不是引发异常。C++ 中的异常要么使用 显式抛出,要么
throw
在特定情况下从语言和标准库构造中隐式抛出。除以 0 不是这种情况。是的,有这样的选择。
来自cplusplus.com:
因为 俄语社区,本质是这样的:
也可以将 try-catch 块嵌套在其他外部块中。在这些情况下,内部的 catch 块可以将异常重定向到外部的异常。
throw;
这是使用不带参数的表达式来实现的。这证实了AR Hovsepyan在问题下的评论中所说的话: