在C#中实现自定义异常的行业标准最佳做法是什么?
我已经检查了Google,并且提出了大量建议,但我不知道哪些建议具有更高的可信度。
如果有任何人有权威文章的链接,那也会有所帮助。
答案 0 :(得分:67)
创建自定义例外的标准是从Exception派生。然后,您可以引入自己的属性/方法和重载的构造函数(如果适用)。
以下是自定义ConnectionFailedException
的基本示例,它接受一个特殊于异常类型的额外参数。
[Serializable]
public class ConnectionFailedException : Exception
{
public ConnectionFailedException(string message, string connectionString)
: base(message)
{
ConnectionString = connectionString;
}
public string ConnectionString { get; private set; }
}
在应用程序中,这可以在应用程序尝试连接到数据库的情况下使用,例如
try
{
ConnectToDb(AConnString);
}
catch (Exception ex)
{
throw new ConnectionFailedException(ex.Message, AConnString);
}
由您来处理更高级别的ConnectionFailedException
(如果适用)
答案 1 :(得分:8)
我假设您正在寻找异常处理实践。那么请看下面的文章,
http://msdn.microsoft.com/en-us/library/ms229014.aspx //提供有关例外的整体提示,包括自定义例外
答案 2 :(得分:8)
以下是创建自定义异常的代码:
using System;
using System.Runtime.Serialization;
namespace YourNamespaceHere
{
[Serializable()]
public class YourCustomException : Exception, ISerializable
{
public YourCustomException() : base() { }
public YourCustomException(string message) : base(message) { }
public YourCustomException(string message, System.Exception inner) : base(message, inner) { }
public YourCustomException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}
}
另请参阅:http://www.capprime.com/software_development_weblog/2005/06/16/CreatingACustomExceptionClassInC.aspx
答案 3 :(得分:0)
我使用自定义例外来传达错误的性质。
例如,我喜欢使用提供的“ArgumentNullException”框架来检查参数。然后,当我在调试器或错误日志中看到此错误时,我立即知道错误的性质而不再进一步阅读。
频谱的另一端是InvalidOperationException,这可能意味着什么。
自定义异常的替代方法是详细的错误消息。没关系,但通过使ConnectionFailed等自定义异常更有意义。然后消息本身可以提供更多细节。
创建此类自定义例外时,我不添加任何新属性。这样做的原因是,如果您有错误记录器,则希望它能够处理所有异常。如果添加特殊属性,则错误记录器将忽略它。例如,如果使用MSTest,则在运行测试时失败,则不会显示自定义属性。但是,如果你坚持使用基类的Message属性,它将显示正常。
所以子类化非常简单:
public class NavigationException : Exception{
public NavigationException() {}
public NavigationException(string msg) : base(msg) {}
public NavigationException(string msg, Exception inner) : base(msg, inner) {}
}
这非常简单,适用于任何错误记录器,当我看到它时,我知道这是一个导航问题,如果需要我可以查看详细信息。
格雷格