在C#中实现自定义exception的行业标准最佳实践是什么?

在C#中实现自定义exception的行业标准最佳实践是什么?

我已经检查了谷歌,有很多的build议,但是我不知道哪个更具有可信度。

如果有人与权威文章有任何联系,那也是有帮助的。

创build自定义exception的标准是从exception派生。 然后,您可以引入您自己的属性/方法和重载的构造函数(如果适用)。

这是一个自定义ConnectionFailedException的基本示例,它接受一个特定于exceptiontypes的额外参数。

 [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 (如果适用)

另请参阅devise自定义例外和自定义例外

我假设你正在寻找exception处理的做法。 所以看看下面的文章,

http://msdn.microsoft.com/en-us/library/ms229014.aspx //提供有关exception的总体思路,包括自定义exception

b </s> </ s>

以下是创build自定义exception的代码:

 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

我使用自定义exception来传达错误的性质。

例如,我喜欢使用框架提供的“ArgumentNullException”来检查参数。 然后,当我在debugging器或错误日志中看到这个错误时,我立即知道错误的性质,而不需要进一步阅读。

光谱的另一端是InvalidOperationException,这可能意味着什么。

自定义exception的替代方法是详细的错误消息。 没关系,但通过使自定义exception(如ConnectionFailed)更有意义。 那么这个信息本身可以提供更多的细节。

创build这样的自定义exception时,我不添加任何新的属性。 这样做的原因是,如果你有一个错误logging器,你希望它能处理所有的exception。 如果你添加一个特殊的属性,那么错误logging器将会忽略它。 例如,如果您使用MSTest,当您运行testing并失败时,自定义属性不会显示。 但是如果你坚持使用基类的Message属性,它将显示得很好。

所以子类很简单:

 public class NavigationException : Exception{ public NavigationException() {} public NavigationException(string msg) : base(msg) {} public NavigationException(string msg, Exception inner) : base(msg, inner) {} } 

这是非常简单的,适用于任何错误logging器,当我看到它,我知道这是一个导航问题,我可以查看细节,如果需要的话。

格雷格