繁体   English   中英

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

[英]What are industry standard best practices for implementing custom exceptions in C#?

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

我检查了谷歌,并提出了大量建议,但我不知道哪些建议具有更高的可信度。

如果任何人有权威文章的链接,那也会有所帮助。

创建自定义异常的标准是从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 (如果适用)

另请参阅设计自定义例外自定义例外

以下是创建自定义异常的代码:

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

我假设您正在寻找异常处理实践。 那么请看下面的文章,

http://msdn.microsoft.com/en-us/library/ms229014.aspx //提供有关异常的整体提示,包括自定义异常

http://blogs.msdn.com/b/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx //

我使用自定义异常来传达错误的本质。

例如,我喜欢使用提供“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) {}
}

这非常简单,适用于任何错误记录器,当我看到它时,我知道这是一个导航问题,如果需要我可以查看详细信息。

格雷格

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM