[英]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
分支。
如果可以,请始终避免出现异常。
例外应该是例外。
如果可以预测,请防止发生。
应该禁止使用空的捕获块的人使用计算机。
不陷入困境也更快。
抛出异常是一项昂贵的任务,因此我将始终尝试并验证而不是捕获。
这应该很容易测试,生成一些在每次运行时都会引发异常的代码,并针对一组类似的,进行条件检查和衡量性能的代码进行测试。
如果代码中记录了将引发异常的详细信息,则您应该能够调整您的调用代码。 当然,您不能处理所有情况(可能是较低级别的运行时错误?),因此您的代码应该只真正尝试并处理可能实际响应并可能继续的异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.