0

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

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"

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

4

3 回答 3

3

看起来你真的不知道如何处理异常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属性。

于 2013-01-22T05:27:10.163 回答
0

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

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

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

或者,如果您想抛出一个更具表现力的异常,您可以在其他地方创建一个自定义异常(通过从 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。

于 2013-01-22T05:28:30.810 回答
0

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

  • 创建一个新程序集(项目)并在您的应用程序中引用它
  • 声明接受您的个人数据类型的新共享事件(引用程序集)
  • 声明至少一个对新事件执行 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
于 2013-01-22T06:02:33.143 回答