我们在编写程序的时候,常常要使用Try Catch来进行异常的捕获。有时,将暂时无法处理的异常继续向外抛出也是十分常见的用法。完成这项操作可以通过两种方式,第一种是判断后继续抛出异常;第二种则是通过filter进行条件过滤,只捕获条件符合的异常。我们分别用两个子程序演示他们:
'检查后重新抛出异常
Private Sub Test1()
Dim a As Integer = 0
Try
a = 2 \ a
Catch ex As Exception
If a <= 0 Then Throw
End Try
End Sub
'用过滤器根据条件捕获异常
Private Sub Test2()
Dim a As Integer = 0
Try
a = 2 \ a
Catch ex As Exception When a > 0
End Try
End Sub
注意到区别了吗,一个是通过Throw语句完成,而另一个则是通过When语句。我用的抛出异常的语句是a = 2 \ a,它产生的被零除异常速度非常快,要比直接抛出Exception的实例还要快的多,只有这样我们才能将比较的焦点放在捕获上。
这是测试的代码:
Dim w As New Stopwatch()
For i As Integer = 1 To 50
w.Start()
Try
Test1() 'Or Test2()
Catch ex As Exception
End Try
w.Stop()
Next
TextBox1.AppendText(w.ElapsedMilliseconds & vbCrLf)
测试进行在Release,不开优化(以免编译器改变机理)的情况下,预运行10次的条件下,这是两者的对比(毫秒):
Throw版:341
Filter(When)版:169
性能差距极大!Throw是一个非常慢的操作。相比之下Filter则十分快速。此处只循环了50次,就能有数百毫秒的差距,可见此性能差距是日常程序里肉眼就能看出的严重差距。建议大家需要按条件捕获异常时,尽量用When语句,以获得Filter的性能好处。
打印 | 张贴于 2004-08-30 22:07:00 | Tag:灵感记录
留言反馈
用vb么?姐姐,岔什么?嗬嗬
要知道异常还是有很多好处的,标榜的优点我就不谈了
异常机制还可以用于anti-debug、动态解压等方面,单是给动态分析cracker增添n多麻烦这一点就已经能显示了异常的优势了
不过我觉得对实际工作意义不大。说到底异常不应该是一个经常发生的事件,若您的程序持续不断的出现异常,那么我怀疑这个程序的价值。
如果偶尔出现个次把的异常,那么用filter节省下来的几十ms,真的有意义吗?
:)
你还写on error resume next就行了,功能不变。
@無名小卒
When右边是一个表达式,只有表达式满足才会进入Catch段。这是VB和.NET Framework支持的功能,C#不支持。