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

例外とエラーへのアプローチ全体を変更します。

  • 新しいアセンブリ (プロジェクト) を作成し、アプリケーションで参照します
  • 個人データ型 (参照アセンブリ) を受け入れる新しい共有イベントを宣言します。
  • 新しいイベントで RaiseEvent を実行する少なくとも 1 つの共有関数 (参照アセンブリ) を宣言します。
  • それに応じて反応する共有イベントのハンドラー (メイン アプリケーション) を追加します。
  • エラー/例外をスローする必要があるときはいつでも独自のパラメーターを渡して、メイン アプリケーション内から関数を呼び出します。

このようにして、多くのプログラミング ミスを回避し、エラーと例外処理を一元化します

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 に答える
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 に答える