是否可以抛出异常并在不使用try块的情况下捕获异常? 例如:为什么在捕获异常处理之前需要try块C++
int main()
{
throw 1;
catch(int){
std::cerr << "caught exception\n";
}
return 0;
}
是否可以抛出异常并在不使用try块的情况下捕获异常? 例如:为什么在捕获异常处理之前需要try块C++
int main()
{
throw 1;
catch(int){
std::cerr << "caught exception\n";
}
return 0;
}
飞行异常期间程序控制流程的行为有细微差别。 try-catch
块有希望使程序回到通常的控制流程。
当程序中的任何一点抛出异常时。 正常程序控制流程暂停。程序控制流程现在通过运行时的异常处理机制。这与正常不同。对于正常的,当控制流程到达范围末尾时,自动存储的析构函数总是运行,这些析构函数始终运行在(使用期)“}
”。对于在飞行中的例外,他们跑早比正常
考虑这个(注意评论);
MyClass foo(){
{
MyClass c;
c.call(balhhh); //assuming this throws
// (1)
....
return c;
}
void bar(){
std::map<K,V> mp;
auto c = foo();
// (2)
mp.insert(c);
....
}
当你调用bar
,我们可以看到控制流程是如何每成熟叶foo()
在// (1)
,// (1)
后没有其他代码的foo()
范围内,当foo()
已经展开同样的事情发生执行,我们现在正处于// (2)
这种情况在整个堆栈回卷的过程,而这个递归解开所有功能......直到我们回到main()
其中std::terminate
被调用。
现在,随着的try-catch块,编译器生成暂停该程序后早期退出行为已经转移到catch块(在寻找一个匹配的处理器)的代码,如果异常处理,控制流程恢复正常。
考虑:
MyClass foo()
try {
MyClass c;
c.call(balhhh); //assuming this throws
// (1)
....
return c;
}
catch(...){
...
}
void bar(){
std::map<K,V> mp;
auto c = foo();
// (2)
mp.insert(c);
....
}
现在,当异常离开,控制流离开在// (1)
规范来搜索相关的catch
处理程序,如果异常被处理,程序返回到正常的控制流程。 // (2)
之后的代码将立即执行...
你可以从解释见,的try-catch块是唯一的方式,通过C++标准规定,则抛出异常后恢复正常程序控制流。
int main()
{
throw 1; //fine, program control leaves the whole of main at this point.
catch(int){ //illegal, like using an else block without an if
std::cerr << "caught exception\n";
}
return 0;
}
即使上面的代码是合法的,throw
意味着控制将离开全封闭范围内的在throw
网站。
真的很难跟随这个答案。它如何处理提出的问题? –
你想说明什么?问题是''是否有可能抛出一个异常并且不使用try块来捕获它呢?' –
@AbhinavGauniyal,也许你没有看到这样的问题:*“为什么在catch块在异常处理之前编写try块C++ “*。没关系。您可以再次查看标题。关于我想解释的内容的问题;如果你阅读的时间太长,我会优雅地总结一下: - 我解释了控制流的概念,当异常处于飞行状态时和不在时;以及* try-catch *块如何帮助语言和代码的semmatics。 – WhiZTiM
根据我的经验,你必须使用try和catch块的组合。如果在try块中发生任何错误,那么只有它被传递给catch块。因此,如果没有尝试块,那么它将不知道在哪里查找错误。因此他们需要结合使用。我不确定在C++中,但在Java中,如果将类扩展为throwable,则可以单独使用catch块。
不知道为什么这是downvoted ??对于自己不知道C++异常如何工作的人,也许? –
号(有些填充) – Barry
为什么,当然可以!这里:'int main(){std :: cerr <<“捕获异常\ n”;返回0; }' –
@MikeNakis:什么? –