在C#中,我如何定义自己的exception?

在C#中,我如何定义自己的exception?

创build自己的exception的准则(旁边的事实,你的类应该从exceptioninheritance)

  • 确保类是可序列化的,通过添加[Serializable]属性
  • 提供exception使用的通用构造函数:

     MyException (); MyException (string message); MyException (string message, Exception innerException); 

所以,理想情况下,您的自定义Exception应该看起来像这样:

 [Serializable] public class MyException : Exception { public MyException () {} public MyException (string message) : base(message) {} public MyException (string message, Exception innerException) : base (message, innerException) {} } 

关于你是否应该从ExceptionApplicationExceptioninheritance的事实:FxCop有一个规则说你应该避免从ApplicationExceptioninheritance:

CA1058:Microsoft.Design:
更改“MyException”的基本types,以便不再扩展“ApplicationException”。 这个基本的exceptiontypes不会为框架类提供任何额外的值。 代之以扩展“System.Exception”或一个现有的非密封的exceptiontypes。 除非在为整个exception类创build捕获处理程序方面有特殊的价值,否则不要创build新的exception基types。

请参阅MSDN上关于此规则的页面 。


看来我已经开始了一个例外的Sublcassing战斗。 根据Microsoft最佳实践指南,您遵循…您可以从System.Exception或System.ApplicationExceptioninheritance。 有一个很好的(但老的)博客文章,试图澄清混乱。 现在我将继续使用Exception作为示例,但是您可以阅读该文章并根据需要select:

http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx

没有更多的战斗! 感谢Frederik指出FxCop规则CA1058,其中指出您的exception应该inheritanceSystem.Exception而不是System.ApplicationException:

CA1058:types不应扩展某些基本types


定义一个inheritance自Exception的新类(我已经包含了一些构造函数,但是你不必拥有它们):

 using System; using System.Runtime.Serialization; [Serializable] public class MyException : Exception { // Constructors public MyException(string message) : base(message) { } // Ensure Exception is Serializable protected MyException(SerializationInfo info, StreamingContext ctxt) : base(info, ctxt) { } } 

在你的代码的其他地方抛出:

 throw new MyException("My message here!"); 

编辑

更新以确保可序列化的exception。 详细信息可以在这里find:

Winterdom博客存档 – 使exception类可序列化

如果您将自定义属性添加到您的Exception类,请密切关注需要采取的步骤。

感谢伊戈尔给我打电话!

界定:

 public class SomeException : Exception { // Add your own constructors and properties here. } 

扔:

 throw new SomeException(); 

定义:

 public class CustomException : Exception { public CustomException(string Message) : base (Message) { } } 

投掷:

 throw new CustomException("Custom exception message"); 

你可以定义你自己的例外。

用户定义的exception类是从ApplicationException类派生的。

你可以看到下面的代码:

 using System; namespace UserDefinedException { class TestTemperature { static void Main(string[] args) { Temperature temp = new Temperature(); try { temp.showTemp(); } catch(TempIsZeroException e) { Console.WriteLine("TempIsZeroException: {0}", e.Message); } Console.ReadKey(); } } } public class TempIsZeroException: ApplicationException { public TempIsZeroException(string message): base(message) { } } public class Temperature { int temperature = 0; public void showTemp() { if(temperature == 0) { throw (new TempIsZeroException("Zero Temperature found")); } else { Console.WriteLine("Temperature: {0}", temperature); } } } 

并抛出一个例外,

如果它是从System.Exception类直接或间接派生的,则可以抛出一个对象

 Catch(Exception e) { ... Throw e }