实现通用自定义exception的优点和缺点

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

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

创建自定义exception类:

 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方法是一个枚举扩展方法,它使用reflection获取枚举描述。 这样,我可以抛出exception,如:

 throw new customException(enums.Errors.TestError); 

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

 Console.WriteLn(ex.Message); 

我见过MVP推荐的这种方法。 这种方法对以下方面有什么好处:

  • 使用genericsexception:抛出新的exception(“错误消息”);.
  • 使用自定义例外:为任何情况定义自定义例外。 例如( WebServiceException类, AuthenticationException类等)

这是 MVP推荐的链接 。

谢谢。

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

您应该始终抛出特定的例外情况。 捕捉同样如此。

我们很容易决定是否要捕获WebServiceExceptionAuthenticationException ,但是使用您的Enum示例,我们必须解析一个字符串以决定是否要捕获它。 如果此消息更改会发生什么?

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

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

 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枚举示例仍然可以保留此function。 但是,您可以给自己一个位置来定义消息,但应用程序可以通过各种不同的方式解决这些问题。 枚举示例将使创建本地化消息变得非常简单,因为它将为您提供一种独立定义消息字符串的方法。

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

 public class MyCustomeEx : Exception { int CustID { get; set; } } public void Fail() { //Awww Customer error throw new MyCustomeEx () {CustID = 123} } 

选项1我不建议。 你根本不应该抛出System.Exception 。 您应始终为您的情况抛出最具体的exception,以便在代码中进行合理的结构化exception处理。

我在你提出的方法中看到的主要缺点( Errors enum )是你没有办法决定你是否要先处理它而不先处理exception。 使用自定义例外,您可以事先做出决定。

请在以下类似的Stack Overflow问题中查看我的(已接受)答案: 自定义exception与内置exception以及非常具有描述性的消息 。 它应该有助于提供反对不明确的自定义exception的论据。

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

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