我们在编写程序的时候,常常要使用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的性能好处。
本文地址:http://com.8s8s.com/it/it36221.htm