4

实现自定义异常的优缺点如下:
创建一个在其描述中表示错误消息的枚举:

public class Enums
{
    public enum Errors
    {
        [Description("This is a test exception")]
        TestError,
        ...
    }
}

创建一个自定义异常类:

public class CustomException : ApplicationException
{
    protected Enums.Errors _customError;
    public CustomException(Enums.Errors customError)
    {
        this._customError = customError;
    }
    public override string Message
    {
        get
        {
            return this._customError!= Enums.Errors.Base ? this.customError.GetDescription() : base.Message;
        }
    }  
}  

GetDescription方法是一种枚举扩展方法,它使用反射获取枚举描述。这样,我可以抛出异常,如:

throw new customException(enums.Errors.TestError);  

并在 catch 块中向用户显示,例如:

Console.WriteLn(ex.Message);  

我见过 MVP 推荐的这种方法。与以下内容相比,这种方法有什么好处:

  • 使用通用异常: throw new Exception("Error Message");。
  • 使用自定义异常:为任何情况定义自定义异常。例如(WebServiceException类、AuthenticationException类等)

这是MVP 推荐的链接。

谢谢你。

4

5 回答 5

5

就个人而言,我认为这不是一个好主意。

您应该始终尽可能抛出特定的异常。捕捉也是如此。

很容易决定我们是否要捕获 a WebServiceExceptionor AuthenticationException,但是对于您的枚举示例,我们必须解析一个字符串来决定是否要捕获它。如果此消息更改会发生什么情况?

我认为它根本没有任何好处。对于每种错误类型,您必须创建一个新的 Enum 成员。为什么不创建一个新类呢?

于 2011-06-10T17:56:15.690 回答
3

自定义异常的主要优点是语言支持区分不同的异常类型。例如

try 
{
    SomeFunc()
}
catch( CustomException EX)
{
    //This is my error that I know how to fix
    FixThis()
    DoSomeAwesomeStuff()
}
catch( Exception exa)
{
    //Somthing else is wrong 
    WeepLikeBaby();
}

如果我使用消息属性

try 
{
    SomeFunc()
}
catch( Exception exa)
{
    if(exa.Message == "ErrType 1")
    {
        DoStuff;
    }
    if(exa.Message == "ErrType 2")
    { 
         Die();
     }
}

使用 Base 枚举示例仍然可以保留此功能。但是,您给自己一个地方来定义您的消息,但这可以通过应用程序以各种不同的方式解决。枚举示例将使创建本地化消息变得非常简单,因为它将为您提供一种独立定义消息字符串的方法。

另一个优点是您可以添加对您的应用程序有意义的 Cusotm 数据。例如,假设您有一个客户信息系统,客户 ID 几乎总是很重要。如果您仅使用消息属性,则每个处理程序都必须知道如何在需要时解析该信息。

public class MyCustomeEx : Exception
{
    int CustID { get; set; }
}

public void Fail()
{ 
    //Awww Customer error
    throw new MyCustomeEx () {CustID = 123}
}
于 2011-06-10T18:03:26.140 回答
2

选项 1 我不推荐。你根本不应该扔东西System.Exception。您应该始终抛出适用于您的情况的最具体的异常,以便在您的代码中进行合理结构化的异常处理。

我在您提出的方法 ( ) 中看到的主要缺点Errors enum是,如果不先捕获异常,就无法决定是否要处理异常。使用自定义例外,您可以事先做出决定。

于 2011-06-10T18:02:56.627 回答
2

请在以下类似的 Stack Overflow 问题中查看我的(已接受)答案:Custom exception vs built in exception with very descriptive message。它应该有助于提供反对无聊的自定义异常的论据。

于 2011-06-10T18:05:08.637 回答
2

在评论中分享了指向 MVP 建议的链接。

在查看了代码和问题后,我认为这样做的原因是为了限制异常中可能出现的消息。也许有助于本地化异常文本,但是在这个例子中还有额外的工作要做。无论如何,这种方法不应该用于创建处理方式不同的“异常子类型”。

于 2011-06-10T18:09:22.667 回答