我有一个函数(表单中的事件处理程序)结构如下:
Dim errMsg as String = "" CheckIfValidUser(...,errMsg) If errMsg.Length > 0 Then ShowError(errMsg) LogError(errMsg) Return End If CheckIfBookAvailable(...,errMsg) If errMsg.Length > 0 Then ShowError(errMsg) LogError(errMsg) Return End If ReserveBook(...,errMsg) If errMsg.Length > 0 Then ShowError(errMsg) LogError(errMsg) Return End If BookReserved = True
我注意到大多数代码都是类似的结构,所以我尝试重构如下:
Dim errMsg as String = "" Dim HandleError = Sub() If errMsg.Length > 0 Then ShowError(errMsg) LogError(errMsg) Return End If End Sub CheckIfValidUser(...,errMsg) HandleError() CheckIfBookAvailable(...,errMsg) HandleError() ReserveBook(...,errMsg) HandleError() BookReserved = True
但它不会起作用,因为我需要“返回两次”而不是从嵌套函数返回!使用goto也不起作用,因为exiting标签超出了嵌套函数的范围.
无论如何在.net中执行此操作?我知道可以从HandleError返回一个布尔值并对其进行分支,但是它会再次返回到相同的重复结构.
解决方法
如果修改方法以抛出异常而不是返回ByRef错误消息,则可以按如下方式重写代码:
Try CheckIfValidUser(...) CheckIfBookAvailable(...) ReserveBook(...) BookReserved = True Catch ex As Exception ShowError(ex.Message) LogError(ex.Message) End Try
通常,捕获所有异常(“Pokemon Exception handling”)被认为是不好的做法,除非在最外层(即用户界面)进行此操作.由于您显示错误消息(并且因为您提到这是表单中的事件处理程序),所以这似乎就是这种情况.
Dim errMsg as String = "" CheckIfValidUser(...,errMsg) If errMsg = "" Then CheckIfBookAvailable(...,errMsg) If errMsg = "" Then ReserveBook(...,errMsg) If errMsg <> "" Then ShowError(errMsg) LogError(errMsg) Return End If BookReserved = True
就个人而言,我更喜欢第一种选择,因为这对于现在.NET中的事情来说更加惯用.不必将业务逻辑与技术错误处理细节进行集群,这正是异常如此强大的原因.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。