在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) {} }
关于你是否应该从Exception
或ApplicationException
inheritance的事实:FxCop有一个规则说你应该避免从ApplicationException
inheritance:
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 }