加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.net – 是否可以从嵌套函数“返回两次”?

发布时间:2020-12-17 07:24:18 所属栏目:百科 来源:网络整理
导读:我有一个函数(表单中的事件处理程序)结构如下: Dim errMsg as String = ""CheckIfValidUser(...,errMsg)If errMsg.Length 0 Then ShowError(errMsg) LogError(errMsg) ReturnEnd IfCheckIfBookAvailable(...,errMsg)If errMsg.Length 0 Then ShowError(errM
我有一个函数(表单中的事件处理程序)结构如下:

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中的事情来说更加惯用.不必将业务逻辑与技术错误处理细节进行集群,这正是异常如此强大的原因.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读