标题:[原创]如何正确的使用.net异常处理机制
取消只看楼主
foproxs
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2006-4-24
 问题点数:0 回复次数:1 
[原创]如何正确的使用.net异常处理机制

编者:天诛
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,这实在不是好的办法。好的代码不是通过异常处理机制来完成的,而是通过严谨的逻辑及代码编写来完成。

以上只是我个人对异常处理的一点点看法,只供大家学习参考。

搜索更多相关主题的帖子: target blank foproxs 机制 
2006-06-27 13:21
foproxs
Rank: 1
等 级:新手上路
帖 子:132
专家分:0
注 册:2006-4-24
得分:0 
以下是引用noshow在2006-6-27 14:00:40的发言:
我初学.NET .目前编程感觉.NET一出现错误自己找太难找了,我一般出错就CATCH一层层CATCH,如果找到问题所在了再把CATCH去掉,感觉这样好费劲啊,因为一层层的找都要累死了.后来我就编一段CATCH一段,免得出现错误找不到哪里错误,不过这样感觉也挺别扭袄.反正感觉那东西顶多是辅助作用,还是提高自己编程的能力重要袄.

如果你认为错误太难找或者不想去找,你就永运都离不开try...catch,还是多找找错误,尽量少用try...catch,对你编程很有帮助的,不要把try...catch当成你的法宝.


2006-06-27 16:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-75140-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.084648 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved