否则,掷接球的好处是什么

时间:2019-01-31 13:01:11

标签: c++ c++11 exception-handling

我经历了这个question,并且了解标准异常objects。我的问题是,使用异常比简单的函数调用有什么好处?

示例代码A

#include <stdexcept>

int compare( int a, int b ) {
    if ( a < 0 || b < 0 ) 
        throw std::invalid_argument( "received negative value" );
    else
        // return normal results
}

try {
    compare( -1, 3 );
}
catch( const std::invalid_argument& e ) {
    // do stuff with exception... 
}

和代码B

int compare( int a, int b ) {
    if ( a < 0 || b < 0 ) 
        throwFunc( "received negative value" );
    else {
        // Perform normal task
     }
}


compare( -1, 3 );

throwFunc(const std::string& e ) {
    // do stuff with exception... 
}

代码A比代码B有什么好处?标准异常对象的好处是什么?最终,我们只抛出一个变量或字符串。

2 个答案:

答案 0 :(得分:0)

很显然,您认为处理异常意味着仅处理异常对象本身。例如,如果您想对异常进行的所有操作就是记录异常然后终止程序,则确实如此。在这种情况下,您使用throwFunc的方法也可以使用。

但是关于异常的主要事情是,您需要在调用堆栈的正确位置准确捕获它们,然后进行处理,然后继续执行程序。 compare函数通常没有足够的错误信息,因此,当引发异常时,堆栈正在展开,程序执​​行将跳至最近的catch,这应该正是您可以处理错误的地方。

使用您的trowFunc,您将无法向上跳 堆栈来找到这样的地方。您可以调用functon,在该处执行某些操作,然后返回到compare函数,该函数仍然不知道如何处理该问题。而且它的调用者可能也不知道该怎么办。等等。

答案 1 :(得分:-2)

if/else条件语句与安全处理异常的throwtry/catch块无关。

尝试/捕获:

如果您期望代码块/代码段中有任何可能的错误/未定义/例外情况,则可以throw例外。在不因突然的错误和异常中断而中断程序控制流的情况下,您可以安全地在try块中执行可能的异常代码段,并通过throw引发异常,如果您已经知道该异常的特征,期望,然后通过处理该异常来执行与该异常对应的catch块。这样,您的程序就不会通过突然跳转来改变其控制流。

enter image description here

每当发生异常时,程序控制流程都会更改,因为该过程将通过称为异常表的跳转表调用与异常相关的间接过程,再进入称为异常处理程序的操作系统子例程。

当异常处理程序完成处理时,根据导致异常的事件类型,发生三件事之一:

1。处理程序将控制权返回给当前的Icurr指令,即发生事件时正在执行的指令。

2。处理程序将控制权交还给Inext,如果未发生异常,本应执行的指令将继续执行。

3。处理程​​序中止中断的程序。

如果/其他

if/else是条件语句。 if检查执行代码段的条件。在else条件为假的情况下,if可以通过执行代码段来扩展if

特定于您的示例的解决方案:

int compare( int a, int b ) { 
if ( a < 0 || b < 0 )
 throwFunc( "received negative value" ); else {
 // Perform normal task
 } 

} 
compare( -1, 3 ); 

throwFunc(const std::string& e ) { 
// do stuff with exception... 
}

不能保证compare (-1,3);会执行,也不能保证遇到不安全处理的代码段之后的任何事情都可以执行。