大量使用Try...Catch会有什么问题么?

cobra_chen 2011-05-30 10:53:56
VB新手。
对很多错误处理不了解。
发现Try...Catch非常好用。
有些地方出错也可以让程序不死。
而且,有些需要做很多校验的数据。

最简单的就是需要把字符串转换成浮点型。
如果做校验就要遍历这个字符串,然后检查。

直接Try...Catch一下就可以知道数据是否正确。
这样我就可以省去做数据校验的工作了。


但是公司一位比较资深的程序员告诉我。
Try...Catch不要用。
我问为什么,他告诉我“不要用就对了。”
各位大神,Try...Catch用多了。
会出现什么问题么?
...全文
1383 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cobra_chen 2011-05-31
  • 打赏
  • 举报
回复
谢谢了。
看来我把写C和C++代码的风格都带到.net里了
惭愧,这么好用的机制,我没用。
不过感觉,VB的执行效率好像不是很好。
感觉思路在MFC里运行要比VB里快。
不过VB写代码比MFC要简单,尤其界面。
结贴,谢谢各位大神

[Quote=引用 17 楼 hztltgg 的回复:]
VB.NET code

我是会这样写

[code=VB.NET]
Module Module1

Sub Main()

Do
Dim a = Console.ReadLine
Try
Console.WriteLine(IsMyNumber(a))
……
[/Quote]
vrhero 2011-05-31
  • 打赏
  • 举报
回复
-1.0显然在-10.0到-32.0之间,也就是说这个值是合法值
---------------------
不清醒,看错...但是就算这里是非法值,给最终用户提示一下就行了,没必要抛异常...
vrhero 2011-05-31
  • 打赏
  • 举报
回复
-1.0显然在-10.0到-32.0之间,也就是说这个值是合法值...这叫哪门子报错?用户根本搞不清这个你-1.0到底是什么意思...

如果这是你的习惯,那是很坏的习惯...你在臆造用户需求,隐藏不该隐藏的异常...

另外,给用户“报错”有很多种方法,对最终用户应该给他们user friendly错误信息...抛异常通常是给合作开发者用的...

就你这个例子而言,用户输入验证完全没必要抛异常...
hztltgg 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cobra_chen 的回复:]
Return -1.0
这个我的一个习惯。
只要不在0,-10.0,-32.0之间就好了。
以前写C++的时候,的一个习惯。
-1,如果unsigned类型的数据的话,表示一个最大值。


引用 14 楼 hztltgg 的回复:
不是就报错给用户,输入数据错误。
===========
既然不是就报错,为什么又用
Catch ex As Exception
Return ……
[/Quote]

Return -1.0

在以前,有异常的时候都是各自为政,想怎么处理就这么处理,返回错误码这类用法比较多,这样很乱,在.net下,异常都统一来处理,全部用throw来抛出异常。
hztltgg 2011-05-31
  • 打赏
  • 举报
回复

我是会这样写

[code=VB.NET]
Module Module1

Sub Main()

Do
Dim a = Console.ReadLine
Try
Console.WriteLine(IsMyNumber(a))
Catch ex As ArgumentException
Console.WriteLine(ex.Message)
End Try

Loop While True

End Sub

Function IsMyNumber(ByVal text As String) As Double

Dim num As Double

If Double.TryParse(text, num) Then
If num = 0.0R Or (num >= -32.0R And num <= -10.0R) Then
Return num
Else
Throw New ArgumentException("参数不在范围内")
End If
Else
Throw New ArgumentException("不能转换为Double")
End If

End Function

End Module

[/code]
cobra_chen 2011-05-31
  • 打赏
  • 举报
回复
那么我想问下,什么时候用Try...Catch才是合适的呢?
cobra_chen 2011-05-31
  • 打赏
  • 举报
回复
Return -1.0
这个我的一个习惯。
只要不在0,-10.0,-32.0之间就好了。
以前写C++的时候,的一个习惯。
-1,如果unsigned类型的数据的话,表示一个最大值。

[Quote=引用 14 楼 hztltgg 的回复:]
不是就报错给用户,输入数据错误。
===========
既然不是就报错,为什么又用
Catch ex As Exception
Return -1.0
End Try
把错误都隐含,而随便给了一个-1.0呢?
这个其实还是和你的需求有关,而不是说try能不能用的问题
[/Quote]
hztltgg 2011-05-31
  • 打赏
  • 举报
回复
不是就报错给用户,输入数据错误。
===========
既然不是就报错,为什么又用
Catch ex As Exception
Return -1.0
End Try
把错误都隐含,而随便给了一个-1.0呢?
这个其实还是和你的需求有关,而不是说try能不能用的问题
cobra_chen 2011-05-31
  • 打赏
  • 举报
回复
还是有些不明白。
我做的这个转换,只会用到0,-10.0到-32.0之间的数值。
我转换之后,再判断是不是在0,或者-10.0到-32.0之间。
不是就报错给用户,输入数据错误。
假如用户输入的是23.56.45或者有了其他的输入这样的数据就不对。
我是要防止这样的错误,所以就用了这个模块。
除了这种方法,还是什么方法可以做么?
毕竟这个是UI的部分,如果这个部分都会让程序崩溃。
那岂不是太开玩笑了!
如果按字符来逐个处理,也可以,只是感觉那样很麻烦。
就是判断ASCII值,再判断是不是只有一个点号。
我觉得这样做很麻烦,我是为了省事。
还是说麻烦点,也不要用Try...Catch ?

[Quote=引用 9 楼 sp1234 的回复:]
引用 5 楼 cobra_chen 的回复:

这样的代码算是乱用么?

VB.NET code

Function IsTextNumber(ByVal strText As String) As Double
Dim dText As Double = 0.0

Try
dText = Convert.ToDouble(strText)
Catch ex As ……

……
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用楼主 cobra_chen 的回复:]
发现Try...Catch非常好用。
有些地方出错也可以让程序不死。
而且,有些需要做很多校验的数据。

最简单的就是需要把字符串转换成浮点型。
如果做校验就要遍历这个字符串,然后检查。

直接Try...Catch一下就可以知道数据是否正确。
这样我就可以省去做数据校验的工作了。
[/Quote]
就第二个而言,“把字符串转成浮点数”这个需求说过对于错误格式的字符串内容转成什么浮点数值了吗?如果定义过,那么就应该转成那个值。如果没有,那么就应该让高层次人编写的程序(这通常是系统主程序中的统一的异常事件处理程序)来处理。

就第一个而言,这是一个夸张的概念。应用程序的表现层负责让程序不死,而其它人如果越俎代庖只能自欺欺人地让编程错误无法调试和维护。更何况,许多人不懂得测试,他写出来的程序自己根本发现不了几个bug,那么随便try...catch.....就更无法让它对自己写出来的bug有个正确认识了。
honghu3000 2011-05-30
  • 打赏
  • 举报
回复
影响不大
Friday 2011-05-30
  • 打赏
  • 举报
回复
几条建议:
  ☆ 如果无法处理某个异常,那就不要捕获它。
  ☆ 如果捕获了一个异常,请不要胡乱处理它。
  ☆ 尽量在靠近异常被抛出的地方捕获异常。
  ☆ 在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。
  ☆ 按照您的异常处理必须多精细来构造您的方法。
  ☆ 需要用几种类型的异常就用几种,尤其是对于应用程序异常。
  ☆ 把低层次的异常封装成层次较高程序员较容易理解的异常。
  ☆ 尽量输出造成异常的完整数据
  ☆ 尽量捕获具有特定含义的异常:比如SqlException,而不是简单地捕获一个Exception。
☆ 可能会出现异常的代码块,但又要保证程序稳定性使用,以及出现异常时要做一些后续处理。例如对数据库的一些操作
如果你的程序不是对效率苛求得过分,建议你宁可多使用一些异常也是好的。
注意:我说的多使用的意思不是让你全部trycatch起来,然后catch(Exception e)把所有的异常都屏蔽了;而是暂时不考虑trycatch可能带来的效率上的损失,而注重程序的稳定性。
至于如何优化trycatch的使用,慢慢来。就我个人的使用而言,影响其实不是很大

这玩意儿抄的……
cobra_chen 2011-05-30
  • 打赏
  • 举报
回复
这样的代码算是乱用么?


Function IsTextNumber(ByVal strText As String) As Double
Dim dText As Double = 0.0

Try
dText = Convert.ToDouble(strText)
Catch ex As Exception
Return -1.0
End Try

Return dText
End Function
javashare 2011-05-30
  • 打赏
  • 举报
回复
降低程序性能,降低程序可读性
种草德鲁伊 2011-05-30
  • 打赏
  • 举报
回复
不用或者滥用都是不对的...
绝代坏坏 2011-05-30
  • 打赏
  • 举报
回复
直接结果会导致程序性能下降。但是为了稳定性及健壮性,有些时候必须要牺牲掉一部分性能。
hztltgg 2011-05-30
  • 打赏
  • 举报
回复
sp1234一番话真是醍醐贯耳

try是给UI层用的,
你的转换方法出错就出错呗,为什么要让他等于-1.0呢?系统有这个要求吗?而且校验数据的实际需求有是什么呢?既然你都可以让他异常了等于-1,还去校验的个什么劲?如果有实际校验需求,那么按照设计方案来写代码,而不是一揽子给try了。
vrhero 2011-05-30
  • 打赏
  • 举报
回复
这个也算月经问题了,讲过很多次...

Try Catch本身绝对没有性能问题,滥用异常处理是程序员本身的问题...

乱用或不用都是不对的...可以避免引发异常的判断自己不去做丢给Try Catch、用Try Catch隐藏不该隐藏的异常都是不负责任,该用Try Catch的地方不用任由程序崩溃或让用户不知所措更是无知...
  • 打赏
  • 举报
回复
使用或者不使用,并不是一个绝对的东西。程序员在这种小事上素质降低,跟一个作坊式的开发团队的风气很有关系。如果说(举个过分简单的例子)开发一个计算器程序,那么你们在设计这个产品的时候有产品管理人员对验收测试负责吗?如果有人对产品负责,那么肯定会考虑“不输入数字试一试、输入four试一试”之类的简单测试用例,这时候程序员胡编乱造的一个结果就会立刻看出不但是多余的而且是错误的。
加载更多回复(1)

16,554

社区成员

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

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