我经历了这个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有什么好处?标准异常对象的好处是什么?最终,我们只抛出一个变量或字符串。
答案 0 :(得分:0)
很显然,您认为处理异常意味着仅处理异常对象本身。例如,如果您想对异常进行的所有操作就是记录异常然后终止程序,则确实如此。在这种情况下,您使用throwFunc
的方法也可以使用。
但是关于异常的主要事情是,您需要在调用堆栈的正确位置准确捕获它们,然后进行处理,然后继续执行程序。 compare
函数通常没有足够的错误信息,因此,当引发异常时,堆栈正在展开,程序执行将跳至最近的catch
,这应该正是您可以处理错误的地方。
使用您的trowFunc
,您将无法向上跳 堆栈来找到这样的地方。您可以调用functon,在该处执行某些操作,然后返回到compare
函数,该函数仍然不知道如何处理该问题。而且它的调用者可能也不知道该怎么办。等等。
答案 1 :(得分:-2)
if/else
条件语句与安全处理异常的throw
或try/catch
块无关。
尝试/捕获:
如果您期望代码块/代码段中有任何可能的错误/未定义/例外情况,则可以throw
例外。在不因突然的错误和异常中断而中断程序控制流的情况下,您可以安全地在try
块中执行可能的异常代码段,并通过throw
引发异常,如果您已经知道该异常的特征,期望,然后通过处理该异常来执行与该异常对应的catch
块。这样,您的程序就不会通过突然跳转来改变其控制流。
每当发生异常时,程序控制流程都会更改,因为该过程将通过称为异常表的跳转表调用与异常相关的间接过程,再进入称为异常处理程序的操作系统子例程。
当异常处理程序完成处理时,根据导致异常的事件类型,发生三件事之一:
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);
会执行,也不能保证遇到不安全处理的代码段之后的任何事情都可以执行。