装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

我们在编写程序的时候,常常要使用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:灵感记录

留言反馈

re: Filter与Throw性能对比 编辑
只有VB有啊,,,我说我怎么从来就不知道这种方法呢。
2004-09-01 11:07:00 | [匿名用户:TommyWOo]
re: Filter与Throw性能对比 编辑
@ 叶君临

用vb么?姐姐,岔什么?嗬嗬

要知道异常还是有很多好处的,标榜的优点我就不谈了

异常机制还可以用于anti-debug、动态解压等方面,单是给动态分析cracker增添n多麻烦这一点就已经能显示了异常的优势了
2004-08-31 15:41:00 | [匿名用户:ydaye]
re: Filter与Throw性能对比 编辑
不错,了解了一点过去不知道的东西。


不过我觉得对实际工作意义不大。说到底异常不应该是一个经常发生的事件,若您的程序持续不断的出现异常,那么我怀疑这个程序的价值。

如果偶尔出现个次把的异常,那么用filter节省下来的几十ms,真的有意义吗?

:)
2004-08-31 13:08:00 | [匿名用户:叶君临]
re: Filter与Throw性能对比 编辑
哈哈,又學了一招,以前都不知道when這樣的用法
2004-08-31 08:14:00 | [匿名用户:lichdr]
re: Filter与Throw性能对比 编辑
@crazyingdoctor

你还写on error resume next就行了,功能不变。

@無名小卒

When右边是一个表达式,只有表达式满足才会进入Catch段。这是VB和.NET Framework支持的功能,C#不支持。
2004-08-31 08:01:00 | [匿名用户:Ninputer]
re: Filter与Throw性能对比 编辑
不懂When 那邊是怎麼寫的? 是否可以更進一部的講解? 謝謝
2004-08-30 23:39:00 | [匿名用户:無名小卒]
re: Filter与Throw性能对比 编辑
恐怕是由于test1要RaiseException()两次,test2只一次的关系
2004-08-30 23:37:00 | [匿名用户:ydaye]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System