我听人说,由于堆栈的展开,异常处理有点昂贵。
我没有得到任何东西,无论我是否抛出异常以及是否使用"return“,堆栈展开都会发生。那么,区别在哪里呢?
例如,如果我得到一个我无法处理的内存问题--唯一的选择是停止函数,直到我到达应该处理或通知问题的区域。那么抛出异常的另一个选择是什么呢?
我可以使用"return“来代替抛出异常,但这是一样的。我知道堆栈展开甚至可以后退六个堆栈,但是检查返回值和“返回”结合在一起。
欢迎您的解释。
发布于 2009-12-08 00:36:01
当您使用return时,堆栈是无条件“展开”的,这在概念上可以像执行单个"ret“机器码指令一样简单。在异常情况下,堆栈展开必须搜索合适的异常处理程序,这是一项复杂得多的任务。异常路径还具有构造并可能复制异常对象的任务,这可能不是微不足道的。
发布于 2009-12-08 00:40:33
堆栈展开不同于简单的返回。它还涉及在堆栈的每个较低级别中搜索错误处理程序( catch块)。这就是为什么它是一个繁重的过程。
这就是为什么你应该只在真正的异常情况下使用异常。有关异常处理的警告适用于那些简单地将异常视为在堆栈中更高层传递数据的人;喜欢进行“聪明”编程的人。他们认为这是绕过问题的聪明方法,但他们却创造了两个他们没有预料到的新问题。
一般来说,最好使用异常(对于真正的异常情况),而不是返回代码,因为这会使代码更易于阅读和维护。例如,哪个更容易阅读和维护?
void MyMethod()
{
try
{
Method1();
Method2();
Method3();
}
catch(SomeException const & e) // edited per Mordachai's suggestion
{
// handle SomeException
}
catch(SomeOtherException const & e)
{
// handle SomeOtherException
}
}
void MyMethod()
{
int err;
err = Method1();
switch(err)
{
case SOMEERRORCODE:
// handle some error code
break;
case SOMEOTHERERRORCODE:
// handle some other error code
break;
}
err = Method2();
switch(err)
{
case SOMEERRORCODE:
// handle some error code
break;
case SOMEOTHERERRORCODE:
// handle some other error code
break;
}
err = Method3();
switch(err)
{
case SOMEERRORCODE:
// handle some error code
break;
case SOMEOTHERERRORCODE:
// handle some other error code
break;
}
}发布于 2009-12-08 00:40:24
在发生错误的情况下,错误处理机制的速度并不重要-它们应该执行得太少,以至于不会影响整个程序的性能(它们是异常事件)。
当人们谈论异常处理代价高昂时,他们谈论的是当函数完成而没有引发异常时,它对函数性能的影响。许多编译器将这种开销降低到接近于零-但有些平台,特别是游戏机,可用的编译器或硬件不能很好地处理异常。
https://stackoverflow.com/questions/1861089
复制相似问题