2011-01-07 70 views
12

我想知道,在一般编程中哪些更好或更快?避免发生异常或等待异常?什么更好/更快?尝试赶上或避免异常?

避免的例外是:

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

或者尝试catch异常......

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

取消单词“更快”,这是无关紧要的。这甚至不是正确的使用try-catch的方式,因为你是在拖动CLR。 – BoltClock 2011-01-07 17:24:55

+0

只是一个例子... – carlosdubusm 2011-01-07 17:26:24

+1

@BoltClock,不,它不是。如果发生异常。速度较慢。 – CaffGeek 2011-01-07 17:28:29

回答

18

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

一般来说,不要使用例外进行流量控制。它们实际上是非本地的goto,这使得程序更难以阅读和遵循。因此,它们应该保留用于特殊情况。如果您不能使用try-catch块进行流量控制,请不要。您的程序将更具可读性和可维护性。

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

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

可以避开检查list不为空或不为空,如果有,保证从someMethod返回的值是一个合同(Contract.Ensures)不为空,不为空。

但的确,例外情况在当地非常昂贵。无论它们是否会影响程序的性能(即瓶颈),都是另一个问题。但是正确使用,例外通常不是瓶颈(当应用程序崩溃时谁关心性能?)

1

始终始终始终如果你能避免异常。

例外情况应该是例外。

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

谁使用空的catch块这样的人应该使用一台计算机被禁止......

它也快不进入catch块。

7

异常昂贵 - 如果您可以测试并避免异常,请这样做。

异常不应用于正常的程序流程。

0

投掷异常是一个昂贵的任务,所以我会一直尝试和验证,而不是抓住。

这应该很容易进行测试,生成一些代码,通过每次运行引发异常,并根据执行条件检查和度量性能的类似代码进行测试。

如果代码记录了哪些条件异常将被抛出的详细信息,则应该能够调整您的调用代码。当然,你不能处理每个场景(可能是更低级别的运行时错误?),所以你的代码只能真正尝试并处理可能实际反应并可能继续的异常。

2

这取决于。 我几乎总是尽量避免这种异常,除非这样做成本过高。

0

异常只能用于特殊情况(除非没有其他选择),所以当出现非常不寻常的事情时,您应该只使用try/catch,您仍然需要处理(弹出错误消息)。

try/catch也告诉程序员一些外部错误可能发生并需要处理。在你的例子中,list为null只是程序执行/控制流程的一个正常部分,所以没有什么特殊之处。

此外,一个空的catch-all通常是一件坏事情(虽然有限的情况下,它需要)。无论如何,它肯定需要评论才能解释为什么你没有对异常做任何事情。

有一个useful blog post约棘手的例外可能对您有用

1

单纯从数量的指令/性能的角度来看在显著ñ运行,避免了更贵,因为你每次检查的长度为每个输入。除了例外情况,catch分支仅在该可能情况下执行。

2

当然避免异常,尝试catch会导致损失性能。