1

エラーが発生したときにスローしたい約20の例外メッセージがあります。例外をキャッチするときに、このようなものが必要です

Try
    ' do domthing
Catch ex As CustomInvalidArgumentException
     'do domthing
Catch ex As CustomUnexcpectedException
     'do domthing
Catch ex As Exception
     'do domthing
End Try

現在、私はこのようなクラスを持っています

<Serializable()> _
Public Class CustomException
    Inherits Exception

    Public Sub New()
        MyBase.New()
    End Sub

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

    Public Sub New(ByVal format As String, ByVal ParamArray args As Object())
        MyBase.New(String.Format(format, args))
    End Sub

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

    Public Sub New(ByVal format As String, ByVal innerException As Exception, ByVal ParamArray args As Object())
        MyBase.New(String.Format(format, args), innerException)
    End Sub

    Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
        MyBase.New(info, context)
    End Sub
End Class

例外の種類ごとに Exception を継承するクラスを作成する必要がありますか?

4

1 に答える 1

2

いいえ、から直接継承するために例外クラスを作成する必要はありません。ただし、すべてのカスタム例外が親階層を介して派生できることを確認する必要があります。たとえば、次の継承ツリーを参照してください。ExceptionException

例外
|
|-MyGenericException
| |-MyFooException
| |-MyBarException
|
|-OtherGenericException  
   |-OtherFooException
   |-OtherBarException

一部の例外クラスは、を直接継承していませんExceptionが、親クラスがあり、その親クラスは。から派生していExceptionます。

サンプルコードはメモ帳で書かれたC#ですが、うまくいけばアイデアを得ることができます。

2つのより一般的な例外クラスはから継承しExceptionます。彼らはMyIOExceptionMySecurityExceptionです。他の4つのあまり一般的でないクラスはそれらから派生しています。

//------------ Networking
public class MyIOException : Exception
{
    public string AdditionalData {get; set;}
}
public class MyNetworkFailureIOException : MyIOException
{
    public string Reason {get; set;}
}
public class MyRemoteFileNotFoundIOException : MyIOException
{
    public string RemotePath {get; set;}
}

//------------ Security
public class MySecurityException : Exception
{
    public string UserName {get; set;}
}
public class MyAccessDeniedException : MySecurityException
{
    public string PolicyName {get; set;}
}
public class MyUnauthorizedException : MySecurityException
{
    public string CodeName {get; set;}
}
于 2012-06-19T11:16:11.767 に答える