以下代码将编译但在运行时崩溃:
int main() {
try {
throw;
}
catch(...){
cout<<"In catch";
}
return 0;
}
结果:“hello.exe中0x7c812a5b处的未处理异常:Microsoft C ++异常:[rethrow] @ 0x00000000”
为什么编译器允许代码编译?对于编译器而言,查看此代码是否是catch块的一部分看起来并不困难。
答案 0 :(得分:5)
如果编译器编写者将足够的工作投入其中,编译器可能会捕获数百万个错误。但是那些编译器编写者必须判断这项工作是否值得。在这种情况下,他们决定不(我同意他们)。
答案 1 :(得分:5)
来自C ++标准(15.1.8)
如果当前没有处理异常,则执行不带操作数的throw-expression调用std :: terminate()
由于标准允许它并给出明确的语义,编译器只能符合它。
答案 2 :(得分:3)
不那么容易。您可以在其他函数的catch块中调用此函数。
this answer中描述了所谓的异常处理程序的概念。
答案 3 :(得分:2)
您可以将throw放入从catch块调用的函数中。如果您对一类例外有共同处理,则有时很有用:
void handleXExceptions()
{
try {
throw;
} catch (XA&) {
...
} catch (XB&) {
...
} catch (X&) {
assert("Update handleXExceptions" == NULL);
}
}
void f() {
try {
...
} catch (X&) {
handleXExceptions();
}
}
void g() {
try {
...
} catch (X&) {
handleXExceptions();
}
}
答案 4 :(得分:2)
仅仅因为代码是合法的。你可以这么说:
int* p=0;
*p = 0;
以及其他数以千计的例子。这是合法的但非常错误。
答案 5 :(得分:0)
如何知道函数的调用者不会捕获异常?
答案 6 :(得分:0)
谢谢,我认为我明白了,它就像抛出null异常(没有什么可以抛出)而且编译器不应该为我们做空检查。