【问题标题】:Multiple exception throwing with custom exception class使用自定义异常类引发多个异常
【发布时间】:2012-06-19 11:03:45
【问题描述】:

当发生错误时,我想抛出大约 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 的类

【问题讨论】:

    标签: .net vb.net error-handling


    【解决方案1】:

    不,您不需要让each 异常类直接 继承自Exception。但是您需要确保所有您自定义的异常可以通过父层次结构从Exception 派生。例如,看下面的继承树:

    例外 | |-MyGenericException | |-MyFooException | |-MyBarException | |-其他通用异常 |-OtherFooException |-OtherBarException

    请注意,某些异常类不直接继承自 Exception,但是它们有一个父类,实际上,该父类派生自 Exception

    示例代码是用记事本编写的 C# 代码,但希望您能理解。

    另外 2 个通用异常类继承自 Exception。它们是MyIOExceptionMySecurityException。其他四个不太通用的类派生自它们。

    //------------ 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;}
    }
    

    【讨论】:

    • @Smith 看到我的编辑。对不起,我不是 VB 人,所以代码是 C#。希望它有意义。
    • 这正是我要避免的,为每个异常类型创建一个类MyUnauthorizedException,MySecurityException,MyAccessDeniedException
    • 我永远不会推荐它,但您也可以将MySecurityExceptionMySecurityException.DetailedName 之类的字符串字段一起抛出,在其中放置更指定的异常类型,例如“未授权”。但这不是 OOP 方式,稍后会在后面咬你!我强烈推荐 oleksii 在这方面的方法。随它去吧,尽管它需要更多的工作。
    • @Smith,这是你的设计秀。如果你觉得你需要 20 个不同的类来描述你的领域,那么它没有什么不好的。但是,如果所有这些都只是具有不同的名称和相同的结构(相同的属性、ctors 等),最好不要复制粘贴代码。考虑维护。你可以有一些异常,只提供诸如 Reason、AdditionalInformation、ErrorDescription 之类的属性——你知道一般的东西。对我来说,复杂的企业系统需要 20 种不同的例外。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2023-03-23
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多