2016-10-01 34 views
-1

是否可以抛出异常并在不使用try块的情况下捕获异常? 例如:为什么在捕获异常处理之前需要try块C++

int main() 
{ 
    throw 1; 
    catch(int){ 
     std::cerr << "caught exception\n"; 
    } 
    return 0; 
} 
+2

号(有些填充) – Barry

+1

为什么,当然可以!这里:'int main(){std :: cerr <<“捕获异常\ n”;返回0; }' –

+0

@MikeNakis:什么? –

回答

-2

飞行异常期间程序控制流程的行为有细微差别。 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网站。

+1

真的很难跟随这个答案。它如何处理提出的问题? –

+1

你想说明什么?问题是''是否有可能抛出一个异常并且不使用try块来捕获它呢?' –

+0

@AbhinavGauniyal,也许你没有看到这样的问题:*“为什么在catch块在异常处理之前编写try块C++ “*。没关系。您可以再次查看标题。关于我想解释的内容的问题;如果你阅读的时间太长,我会优雅地总结一下: - 我解释了控制流的概念,当异常处于飞行状态时和不在时;以及* try-catch *块如何帮助语言和代码的semmatics。 – WhiZTiM

0

根据我的经验,你必须使用try和catch块的组合。如果在try块中发生任何错误,那么只有它被传递给catch块。因此,如果没有尝试块,那么它将不知道在哪里查找错误。因此他们需要结合使用。我不确定在C++中,但在Java中,如果将类扩展为throwable,则可以单独使用catch块。

+0

不知道为什么这是downvoted ??对于自己不知道C++异常如何工作的人,也许? –