千家信息网

VB.NET如何使用On Error语句

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍VB.NET如何使用On Error语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!VB.NET推荐使用Try...End Try块来进行结构化的异常处理,但
千家信息网最后更新 2026年11月02日VB.NET如何使用On Error语句

这篇文章主要介绍VB.NET如何使用On Error语句,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

VB.NET推荐使用Try...End Try块来进行结构化的异常处理,但是为了确保兼容性,它也从以前版本的BASIC中借鉴了VB.NET On Error语句。其实On Error并不能算是VB的优点,因为使用它会破坏程序的结构,让带有异常处理的程序难以看懂和调试。但是我一直很惊叹于VB的工程师是怎样实现它的,因为On Error可以让异常的跳转变得很灵活,不像Try那样受到限制。首先看看Try是怎样实现的:

Public Function F1() As Integer  Try  Dim n As Integer = 2 \ n  Catch ex As Exception  MsgBox(ex.Message)  End Try  End Function

这是最简单的异常处理程序,通过Reflector反汇编(如果用ILDasm,不要选择"展开try-catch"),可以发现整个过程被翻译成19条指令。留意这一句:

.try L_0000 to L_0006 catch Exception L_0006 to L_0022

这就是典型的try块,在catch处直接指定要捕获的异常,然后指定catch区的位置,非常清晰。还要留意这两句:

L_0007: call ProjectData.SetProjectError  L_001b: call ProjectData.ClearProjectError

可以看出,这两句是在catch块的开头和末尾。深入这两个过程我发现它是在为Err对象记录异常。看来使用Err也是语法甜头,性能苦头,凭空添加了这两句(幸好都不太复杂)。

接下来我编写了一个与此功能类似的函数,用的是On语句处理异常:

Public Function F2() As Integer  On Error GoTo CATCHBLOCK  Dim n As Integer = 2 \ n  Exit Function  CATCHBLOCK:  MsgBox(Err.Description)  End Function

这不比上一个过程复杂,但是反汇编以后,它的IL代码竟然有47条指令,刚才才19条啊!最主要的改变是try部分,现在它是这样:

.try L_0000 to L_0022 filter L_0022 L_0036 to L_0060

注意,catch不见了,而出现了filter。我从没在C#生成的IL中见过filter。我查询了Meta Data一节的文档,filter大概能够进行一些过滤,满足一定条件才进入处理异常的块中,本例来说,L_0022指令开始就是过滤器,它是:

L_0022: isinst Exception  L_0027: brfalse.s L_0033  L_0029: ldloc.s V_4  L_002b: brfalse.s L_0033  L_002d: ldloc.3  L_002e: brtrue.s L_0033  L_0030: ldc.i4.1  L_0031: br.s L_0034  L_0033: ldc.i4.0  L_0034: endfilter

endfilter就是异常处理部分代码的开始。而L0030之前的代码是过滤器的判断部分,V_4和V_3是VB自己加入保存错误代码的变量。在整个反汇编中,我发现设计成处理异常部分的代码在IL里其实也是在try块中,也就是说程序的结构已经不是规整的try...catch块,产生异常的语句和处理异常的语句在一起,而真正处理异常的指令是一大堆繁冗拖沓的跳转语句。

下面看看我编写的第三个例子:

Public Function F3() As Integer  On Error Resume Next  Dim n As Integer = 2 \ n  End Function

这个值有2行的过程动用了VB强大的语法杀手--On Error Resume Next,它将忽略所有异常,让代码紧接产生异常的语句继续执行下去,猜猜这个功能产生了多少IL指令?答案是50条!比普通的On Error还要长。其实现我就不多说了,和前面的On语句差不多。不过50这个数字似乎提醒了大家,不要在程序里偷懒使用On Error处理异常,这样产生的代价是不可接受的。

***一个例子是VB.NET的When语句,它可以实现对Catch部分的过滤:

Public Function F1() As Integer  Dim n As Integer = 0 Try  Dim m As Integer = 2 \ n  Catch ex As Exception When n = 0 MsgBox(ex.Message)  End Try  End Function

里面的When语句进行了对变量n的判断,仅当n = 0的时候才进入处理部分。听到"过滤"两个字,我们已经猜出,它是用try...filter来实现的。没错。这里的filter主要是进行ex是否是 Exception型,n是否等于零等,当过滤成功,就会转移到异常处理段进行处理。这次VB生成的代码要比VB.NET On Error语句规则得多,结构相当清晰。

以上是"VB.NET如何使用On Error语句"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

处理 语句 代码 部分 指令 程序 结构 过程 就是 是在 复杂 两个 例子 内容 功能 变量 篇文章 语法 过滤器 生成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡网 瑰夏咖啡 互联网佳科技有限公司 广州百单互联网科技有限公司 互联网金融监管科技数据 互联网女皇 腾讯科技 互联网科技公司介绍 科技类的互联网平台 滨湖区互联网智能科技产品供应 福州新华互联网科技学校 知乎 小米互联网科技园设置 承德科技产业互联网发展 银川新华互联网科技职业技术培训学校图片 昊天互联网科技有限公司 华夏互联网科技业 翼展科技 首家互联网医院 互联网企业科技类企业如何做账 35岁以上互联网科技行业 新氧科技和美国互联网有关系吗 广东猫王互联网科技有限公司电话 互联网金融监管科技数据 互联网与科技发展 金融科技与互联网金融 汇久创客互联网科技 壕鑫互联网络科技 昭通云南众福互联网科技有限公司 顶级互联网科技成果有哪些 领航科技大厦互联网公司 重庆科技产业互联网有哪些 互联网科技创业有什么好项目
0