繁体   English   中英

什么更好/更快? 尝试捕获还是避免异常?

[英]What's better/faster? Try-catch or avoid exception?

我想知道,在一般编程中哪个更好或更快速? 避免例外还是等待例外?

避免出现以下异常:

string a = null;
list = someMethod();
if(list.Length > 0 ){
   a = list[0];
}
if(a!=null) ...

或者尝试捕获异常...

string a = null;
try{
    a = someMethod()[0];
catch{}
if(a!=null) ...

在这里,性能并不是最相关的问题。 问题是,哪两个导致程序更易读/可维护/可测试。 您稍后可以担心性能。

通常,请勿将异常用于流控制。 它们实际上是非本地的goto ,这使得程序更难以阅读和遵循。 因此,它们应保留用于特殊情况。 如果您可以不使用try-catch块进行流控制而摆脱困境,那就不要。 您的程序将更具可读性和可维护性。

处理这种情况的“正确”方法是

var list = someMethod();
if(list == null || list.Length == 0) {
    // handle something bad
}
string a = list[0];
if(a != null) {
    // go
}

如果存在一个保证someMethod返回值不为null且不为空的合同( Contract.Ensures ),则可以避免检查list是否为null且不为空。

但是,确实如此,例外在本地昂贵。 它们是否会影响程序的性能(即成为瓶颈)还是另一个问题。 但是使用得当,异常通常不是瓶颈(谁在乎您的应用程序崩溃时关心性能?)

异常的代价很高-如果您可以测试并避免异常,请这样做。

正常程序流程不应使用异常。

当然要避免异常,尝试捕获会导致性能下降。

这取决于。 我几乎总是尝试避免例外,除非这样做的代价太高了。

纯粹从大量N运行时的大量指令/性能角度出发,避免开销更大,因为您要每次检查每个输入的长度。 除了例外,仅在这种情况下执行catch分支。

如果可以,请始终避免出现异常。

例外应该是例外。

如果可以预测,请防止发生。

应该禁止使用空的捕获块的人使用计算机。

不陷入困境也更快。

抛出异常是一项昂贵的任务,因此我将始终尝试并验证而不是捕获。

这应该很容易测试,生成一些在每次运行时都会引发异常的代码,并针对一组类似的,进行条件检查和衡量性能的代码进行测试。

如果代码中记录了将引发异常的详细信息,则您应该能够调整您的调用代码。 当然,您不能处理所有情况(可能是较低级别的运行时错误?),因此您的代码应该只真正尝试并处理可能实际响应并可能继续的异常。

异常仅应用于特殊情况(除非没有其他选择),因此仅应在仍然需要处理非常异常的事件(弹出错误消息)时才使用try / catch。

尝试/捕获还会向程序员发出信号,表明可能发生某些外部错误,需要进行处理。 在您的示例中, list为null只是程序执行/控制流程的正常部分,因此没有什么例外。

同样,空包总之无论如何通常都是不好的事情(尽管在某些情况下需要使用它)。 无论如何,它肯定应该需要注释以解释为什么您不对异常做任何事情。

关于有用的异常,有一篇有用的博客文章 ,您可能会觉得有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM