编者:天诛
QQ:309269473
Email:foproxs@163.com foproxs@hotmail.com
Http:www.pctooler.com
今天在BBS上看到一篇出现异常执行效率就特别低的文章(http://tech.cixiong.com/t/200410/18/0440840.html),虽然大家都讨论了结果,但是结果不尽完善。于是,在这里就我对net异常处理机制的了解来谈谈为什么异常执行效率就特别低的问题,及如何正确的使用异常处理机制。
首先来看看MSDN上对结构化异常处理的说明(.NET Developer Engineer务必了解):
程序通过执行 Throw 语句指示异常条件已经发生。该语句引发类型从 System.Exception 派生的对象,该对象提供有关已经发生的异常的信息。如果表达式没有计算为从 System.Exception 派生的类型的实例,则将发生编译时错误。如果表达式在运行时计算为空引用,则转而引发 System.NullReferenceException 对象实例。
结构化异常处理通过 Try 语句完成。可以在 Try 语句中捕获 Throw 语句所引发的异常。Try 语句的执行以 Try 块中的第一个语句开始。将执行显式地传到 Try 块中是无效的,除非从 Catch 块中。Try 语句必须至少包含一个 Catch 块或 Finally 块。
Throw 语句可以省略 Try 语句的 Catch 块内的表达式。在那种情况下,该语句重新引发 Catch 块中当前正被处理的异常。在下面的示例中,方法 F 捕获一个异常,向控制台写入某些诊断信息,更改异常变量并重新引发异常。
Module Test
Sub F()
Try
G()
Catch e As Exception
Console.WriteLine("Exception in F: " & e.Message)
e = New Exception("F")
' Re-throw here.
Throw e
End Try
End Sub
Sub G()
Throw New Exception("G")
End Sub
Sub Main()
Try
F()
Catch e As Exception
Console.WriteLine("Exception in Main: " & e.Message)
End Try
End Sub
End Module
原始异常被重新引发,因此程序的输出如下:
Exception in F: G
Exception in Main: F
StructuredExceptionStatement ::=(结构化异常语句 ::=)
ThrowStatement(Throw 语句)|
TryStatement(Try 语句)
ThrowStatement ::= Throw [ Expression ] StatementTerminator(Throw 语句 ::= Throw [ 表达式 ] 语句结束符)
TryStatement ::=(Try 语句 ::=)
Try StatementTerminator(Try 语句结束符)
[ Block ]([ 块 ])
[ CatchStatement+ ]([ Catch 语句+ ])
[ FinallyStatement ]([ Finally 语句 ])
End Try StatementTerminator(End Try 语句结束符)
从以上MSDN说明了解到,任何异常对象都是System.Exception派生对象。
public bool test()
{
try
{
throw new SystemException("测试错误!");
}
catch
{
}
return true
}
上述方法将会引发一个System.Exception的异常。Exception 类是异常从其进行继承的基类。大多数异常对象都是 Exception 的某个派生类的实例。
故在异常发生时,异常会确认自己是什么异常实例,而这就是最花费时间的。
既然是异常,那么就是在编程外理之外的事件或条件。所以可以以编程方式检查可能发生的条件或事件,而不使用异常处理。在其他情况下,使用异常处理捕捉错误条件是适当的。
EX:
Thread th;
Try
{
While(!th.IsLive)
{
Thread.Sleep(10);
th.Join();
}
}
Catch
{
}
在上述代码中,由于th为null,所以在执行!th.IsLive时,就会引发异常,而且会引发一个System.NullReferenceException异常类的实例。
系统首先会捕获Exception,然后会具体到某个异常实例。
所以在编写时,尽量的通过代码来处理,而不是把错误都交由异常处理机制来处理。
Try
{
While(!th.IsLive&th!=Null)
{
Thread.Sleep(10);
th.Join();
}
}
Catch
{
}
这样的方法就完美多了。
提醒:我见过许多的.net程序员在开发时,为了减少代码编写量而大量的使用try…catch,这实在不是好的办法。好的代码不是通过异常处理机制来完成的,而是通过严谨的逻辑及代码编写来完成。
以上只是我个人对异常处理的一点点看法,只供大家学习参考。