【问题标题】:VB.NET exception handling for something that returns a data set instead of a stringVB.NET 对返回数据集而不是字符串的异常处理
【发布时间】:2013-01-22 05:20:34
【问题描述】:

我的程序抛出了一个我应该处理的错误。但我无法返回字符串消息,因为它是一个返回数据集的函数:

Public Function getUserInfo(ByValue testUserIdAs String) As DataSet
    Dim dsUseInfo As DataSet = New DataSet()
    Try
        Dim objTestWs As New TestWebService.UserMaintenanceSoapClient
        dsUseInfo = objTestWs.dsGetUserInfo(TestOU, PAC, paramUserID)
        Return (dsUseInfo)
    Catch ex As Exception

        ' TEST FIX ERROR HANDLING -LIWM Please search how to return custom error. I want to return "userid already exists"
        Throw
    End Try

我正在考虑加入:

If error
then return "Error Message"

但我不能将它作为类型字符串返回。

【问题讨论】:

  • 您在 catch 块中抛出异常,因此您不会返回数据集。只需在抛出异常时包含您想要的错误消息,例如throw new Exception("User not found");。不是最优雅的解决方案,但它会让你得到你想要的。

标签: vb.net exception types exception-handling dataset


【解决方案1】:

您似乎真的不知道如何处理 getUserInfo 中的异常,只想将其传递给外部函数。

好吧,这里有关于异常的好处:它们会自动传递!你不需要做任何事情,特别是,你不需要使用函数的返回值那。只是不要捕获异常直到你知道如何处理它


例如,在您的情况下,只需处理 调用 函数中的错误:

  • 从被调用函数中删除错误处理代码:

    Public Function getUserInfo(ByValue testUserIdAs String) As DataSet
        Dim objTestWs As New TestWebService.UserMaintenanceSoapClient
        Return objTestWs.dsGetUserInfo(TestOU, PAC, paramUserID)
    End Function
    
  • 并将其添加到调用函数中,即替换

    ...
    Dim dsUserInfo As DataSet
    dsUserInfo = getUserInfo()
    ...
    

    ...
    Dim dsUserInfo As DataSet
    Try
        dsUserInfo = getUserInfo()
    Catch ex As Exception
        ' Do whatever you want to do in case of an error here
        MsgBox("Could not get User Info: " & ex.Message)
        Return
    End Try
    ...
    

如果您熟悉这种技术,您可以继续学习更高级的主题,例如抛出您自己的异常,就像 @Justin 建议的那样。只需确保在您自己的异常中包含有关错误的原始原因的信息,例如,将ex.Message 的部分内容复制到您自己的异常消息中并设置innerException 属性。 p>

【讨论】:

  • 如果他可能在调用函数中捕捉到许多异常之一,那么捕捉/抛出一个自定义可能会更好。
  • @JustinEdwards:是的,可能有用,但如果操作不当,可能会导致有关原始异常(以及错误的原始原因)的信息丢失。
  • 在这种情况下,似乎抛出带有初始异常的消息,因为内部异常可能是要走的路。
  • @JustinEdwards:确实。我已经扩展了我的答案,感谢您的反馈!
  • @specializt:我不确定我明白你的意思。通常,您的 UI 正下方有一个包罗万象的异常处理程序(只有那里,理想情况下,是您的 UI 库 has a specialized method for that),您可以在其中记录和显示意外错误。
【解决方案2】:

你可以抛出一个通用异常:

Public Function getUserInfo(ByValue testUserIdAs String) As DataSet
    Dim dsUseInfo As DataSet = New DataSet()
    Try
        Dim objTestWs As New TestWebService.UserMaintenanceSoapClient
        dsUseInfo = objTestWs.dsGetUserInfo(TestOU, PAC, paramUserID)
        Return (dsUseInfo)
    Catch ex As Exception
        Throw New Exception("Custom message", ex)
    End Try

这会将您赶上调用堆栈的异常消息设置为“自定义消息”,其中包含包含引发的原始异常的inner exception

或者如果你想抛出一个更明确命名的异常,你可以在别处创建一个自定义异常(通过从 System.Exception 继承)(因此当你想捕获这个自定义类型时,你不必捕获所有异常) .

Public Class UserInfoNotFoundException
    Inherits System.Exception

    Public Sub New()
    End Sub

    Public Sub New(message As String)
        MyBase.New(message)
    End Sub

    Public Sub New(message As String, innerException As Exception)
        MyBase.New(message, innerException)
    End Sub
End Class

然后,例如,您可以抛出 UserInfoNotFoundException。

【讨论】:

    【解决方案3】:

    我会改变处理异常和错误的整个方法:

    • 创建一个新程序集(项目)并在您的应用程序中引用它
    • 声明接受您的个人数据类型的新共享事件(引用程序集)
    • 声明至少一个共享函数(引用的程序集),该函数对您的新事件执行 RaiseEvent
    • 为您在其中做出相应反应的共享事件添加处理程序(主应用程序)
    • 从主应用程序中调用您的函数, 每当您需要抛出错误时传递您自己的参数/ 例外情况

    这样可以避免许多编程错误集中错误和异常处理。

    Public Module IDENTIFIERS
    
        Public Enum EvtMsg
            ERR_MYERR
            ERR_MYERR2
        End Enum
    
        Public Enum EvtClass
            EXCEPTION
            ERR
        End Enum
    End Module
    
    Public Class Events
    
        Shared Event Err(ByVal code As EvtMsg)
        Shared Event Exception(ByRef iEx As Exception)
    
        Public Shared Sub Raise(ByVal iEvtClass As EvtClass, ByVal iMsg As EvtMsg, Optional ByRef iEx As Exception = Nothing)
            If Not [Enum].IsDefined(GetType(EvtClass), iEvtClass) Then
                Dim ex As New ArgumentOutOfRangeException("unbekannte Event-Klasse '" & iEvtClass.ToString & "' übergeben", "iEvtClass")
                RaiseEvent Exception(ex)
            End If
            If Not [Enum].IsDefined(GetType(EvtMsg), iMsg) Then
                Dim ex As New ArgumentOutOfRangeException("unbekannte Event-Msg '" & iMsg.ToString & "' übergeben", "iMsg")
                RaiseEvent Exception(ex)
            End If
    
            Select Case iEvtClass
                Case EvtClass.ERR
                    RaiseEvent Err(iMsg)
                Case EvtClass.EXCEPTION
                    If iEx IsNot Nothing Then
                        RaiseEvent Exception(iEx)
                    Else
                        Dim ex As New MissingFieldException("Raise() ohne Exception aufgerufen, iMsg : " & iMsg & "EvtClass : " & iEvtClass.ToString(), "iEx")
                        RaiseEvent Exception(ex)
                    End If
            End Select
        End Sub
    
    End Class
    

    现在您可以在任何引用您的错误程序集的程序集中轻松使用这些错误处理程序:

    构造函数

    AddHandler Events.Err, AddressOf Err
    AddHandler Events.Exception, AddressOf Except
    

    类体

    Private Sub Except(ByRef iEx As Exception)
        'do your stuff here
    End Sub
    
    Private Sub Err(ByVal Err As EvtMsg)
        'do your stuff here
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2011-07-29
      • 2012-11-26
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多