VB(.net)特色 -- On Error 结构 无法用Try替代??

淡蓝色2 2005-04-25 08:47:50
熟悉VB6的朋友一定很熟悉 VB的 On Error ...结构,这是在VB中唯一的异常处理方法。
现今.net平台提出了全新的Try ... Catch ... Finally结构。不可否认,Try结构让 异常处理 变得更加轻松、异常的层次更为清晰。

不过 有些地方Try结构仍然比不上原VB的On Error结构。
让VB.net用户高兴的是MS在VB.net中保留了On Error。

看下面的代码:
新建一个窗体,添加一个TextBox,名为txtBoard;再添加一个按钮,名为btnExec

在btnExec的OnClick事件写上下面的代码:
'----------------------------------------------
txtBoard.Clear()

On Error GoTo ErrHdl

Dim sngResult As Single
For I As Single = 0 To 3 Step 0.2
'手工引发一个除数为零的异常
If I = 0 Then Throw New DivideByZeroException
'计算并显示结果
sngResult = 8 / I
txtBoard.AppendText _
("8 ÷ " & I & " = " & sngResult.ToString("0.00") & Environment.NewLine)
Next
Return
ErrHdl:
'错误处理
Select Case MessageBox.Show("计算中出现错误:" & Err.Description, "错误", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error)
Case DialogResult.Retry
Resume '转到出错的那行重新执行
Case DialogResult.Ignore
Resume Next '转到出错行的下一行运行
Case Else
'什么都不做,退出
End Select
'-----------------------------------------------------


虽然On Error的性能要稍逊Try 一筹,不过在上述的结构中,可以看出On Error还是比Try更方便、结构更清晰的。

不知这样的On Error 结构能否用Try结构来实现。

欢迎讨论
...全文
481 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
淡蓝色2 2005-04-26
  • 打赏
  • 举报
回复
从上到下,没有人认真地读过代码。
只有 coolksj(Jason.NET(已经做管理的技术人)) 明白了我的意思。

算了,此话题到此为止。
wenhongL 2005-04-26
  • 打赏
  • 举报
回复
up,继续!
真相重于对错 2005-04-26
  • 打赏
  • 举报
回复
感觉楼主对异常和错误处理理解不清
aycn 2005-04-26
  • 打赏
  • 举报
回复
当判断一个函数如果出错就返回 True 或 False 时,
我觉得用 On Error 会比 Try 更方便一些(代码看起来觉得更直观)。
On Error Resume Next 从未用过,感觉是太不安全了。
zldcolin 2005-04-26
  • 打赏
  • 举报
回复
呵呵,没打扰2位吧
MIG29_ELITE 2005-04-26
  • 打赏
  • 举报
回复
"On error Goto" can screen some error in effect. But it has a deadliness shortcoming.That is you will wait for too long which client can not accept.
coolksj 2005-04-25
  • 打赏
  • 举报
回复
一般情况下使用Try

但On Error的确是有优势的,比方说Resume Next关键字,在有些情况下是很有用的
aycn 2005-04-25
  • 打赏
  • 举报
回复
楼上的意思是让楼主向楼上的好好学习?

俺是两者都用,On Error 结构用来 for 函数或过程,Try Catch 用来 for 语句或表达式。
另外一般情况下,能不用就不用。
W_W_Q 2005-04-25
  • 打赏
  • 举报
回复
楼主再好好学习吧......
singlepine 2005-04-25
  • 打赏
  • 举报
回复
帮你顶
淡蓝色2 2005-04-25
  • 打赏
  • 举报
回复
To:wuyazhe(我的宝贝叫阿刺)

别跑题
现在不想讨论语言的优劣问题。
我从12岁就用苹果FBasic、长城BasicA、MS QBasic、以致于后来的VB、VB.net。对于哪些是VB兼容语法,我想我会更熟悉。

几乎所有VB6的函数、方法、语法都能在VB.net的Class方法中找到对应。
现在唯独On Error Resume方法还没找到对应。

我找这个方法是为了使 写出的程序具有更好的兼容性、更符合CLR、能更好地在C#、VB.net之间转换。
兔子-顾问 2005-04-25
  • 打赏
  • 举报
回复
继续抬杠:
你 On error Goto 你能判断错误类型么?你要在GOto的语句那里判断是什么类型的异常是如何的麻烦啊。不过。话说回来。我从来没想过彻底不用vb6的wrap方法。On error resume next,偶尔用,但几乎不用了。上面那样图省事的东西,还是写。但我不用vb6的兼容方法,当时有一个目的,我想通过vb6学习.net语法,以后可以做c#。现在发现,这么做是有效的。我以前也用vb6的。用vb.net以来,看书发现msgbox,on err 是叫做Vb6的兼容语法。对于这些,.net提供的方法更加接近类,对象的概念,更加和其他托管语言接近。无法抗拒的。让我放弃了少打几个字母的清闲。技术角度。我也菜鸟。说不出什么了。不过。感觉用vb6语法,说明你处在vb.net的过度时期。 :)
淡蓝色2 2005-04-25
  • 打赏
  • 举报
回复
回复人: YidingHe(机枪兵) ( ) 信誉:100 2005-04-25 19:48:00 得分: 0
楼主实在要这样说也没办法,我也可以说:
VB.net是代替不了QB的!
别人一定会说:你爱用QB你就用呗!
我也对楼主说:
你爱用on error你就用呗!
----------------------------------------

正因为我不再 想在.net中使用On Error,所以才想寻求一个用Try替代我的例子中的On Error的情况的方法。
淡蓝色2 2005-04-25
  • 打赏
  • 举报
回复
To:wuyazhe(我的宝贝叫阿刺)

1.跟你抬个杠:
把VB.net的编译器的“移除整数溢出检查”选上,则您的代码就还是没有任何问题的:-)

2.说正经的:这段代码确实不太可靠,不过应该这样改一下:

Public m_nData As Integer

Public Sub TestOnErr(byval i As Integer )
On Error GoTo ErrHdl
If i+1 < 15 then
m_nData = 15
End if

Return

ErrHdl: '错误处理
If Err.Code=12345 then '错误代码我也忘了,就是整数溢出的那个错误代码
i -= 1
Resume
Else If Err.Code= ...
Else If Err.Code = ...
End If
End Sub

Public Sub TestErr()
If m_nData = 15 then MessageBox(“Right”)
End Sub

这样就安全了
捏造的信仰 2005-04-25
  • 打赏
  • 举报
回复
楼主实在要这样说也没办法,我也可以说:

VB.net是代替不了QB的!

别人一定会说:你爱用QB你就用呗!

我也对楼主说:

你爱用on error你就用呗!
淡蓝色2 2005-04-25
  • 打赏
  • 举报
回复
先吃饭,回来再对话.
兄弟不错,呵呵
zzzjaychung 2005-04-25
  • 打赏
  • 举报
回复
resume next的功能用TRY来实现好像是感觉不太,,,嗯,不太正常吧。
有的时候,我们确实需要用它来返回,虽然像 wuyazhe(我的宝贝叫阿刺) 讲的,有些不安全。

不知MICROSOFT是不是就是想用TRY让我们放弃resume next,而提高一点安全性,
还是为了让各种语言比较统一。毕竟大家都是.NET吗。
兔子-顾问 2005-04-25
  • 打赏
  • 举报
回复
老落字,上面的一句,修改以下:
准确的估计所有可能。
改为:
无法准确的估计所有可能。
兔子-顾问 2005-04-25
  • 打赏
  • 举报
回复
到家了。
嘿嘿。那换一个好了。
public m_nData As Integer
Public Sub TestOnErr(byval i As Integer )
On Error Resume Next
If i+1 < 15 then
m_nData = 15
End if
End Sub

Public Sub TestErr()
If m_nData = 15 then MessageBox(“Right”)
End Sub

这样调用:
Dim i as Integer
i = i.MaxValue //家里没有.net,大概vb.net是这样写的。就是取int的最大值
TestOnErr(i)

总要异常把。On Error Resume Next 不安全主要是你无法设计的时候,准确的估计所有可能。导致部分的隐患存在。他拦截所有异常并且忽略,没错吧。从设计上,说的绝对一点,就存在着必然发生的逻辑错误。

这个关键字本身。我觉得是除了你实在认为这里错误没可能导致别的地方错误,比如:
Public Sub MyMkDir()
On Error Resume Next
MkDir("c:\aa")
End Sub
这样情况。你可以少写不少代码。不用检测目录是否存在,反正不存在大不了过程结束,如果指定要创建目录,这样做的确不错。但是你保证所有的判断都这么简单么?不影响到别的函数么?只要存在导致其他地方逻辑上错误的可能就是不安全的。但try,catch,finally,end try就可以做到安全。
淡蓝色2 2005-04-25
  • 打赏
  • 举报
回复
To:wuyazhe(我的宝贝叫阿刺)

对于除数为零的问题, .net平台的处理方法是:任何情况下的算术运算 均不允许抛出异常。
比如这句:If 10 / i > 15 then ...,当i=0时,运算结果是“正无穷大”,不会出现任何错误。
“正无穷大”当然是大于15的,所以此If条件结果为真。

所以上面一段代码没有任何不安全的隐患。
加载更多回复(9)

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧