在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
异常。
ConnectionFailedException
,期望是你应该在调用堆栈的更高层捕获它。你可以捕获从 ConnectToDb
抛出的一个更有意义的异常,而不是一个一般的 Exception
,但这只是为了演示目的。 - JamesConnectionFailedException
是您引入的自定义异常。假设 ConnectToDb
方法正在连接到外部数据存储,例如 SQL Server/MySQL 等,则不会抛出 ConnectionFailedException
。相反,它很可能会抛出供应商特定的异常,例如 SqlException
。显然,最好捕获更具体的异常,但由于此示例与数据库无关,因此我们只捕获 Exception
。 - James以下是创建自定义异常的代码:
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
ISerializable
接口(因为 Exception
已经实现了它,而你是从 Exception
继承的),同时你的最后一个构造函数(第四个)可以设置为 protected 访问修饰符(在 Exception
中也是这样)。 - bytedevhttp://msdn.microsoft.com/en-us/library/ms229014.aspx //提供关于异常的总体思路,包括自定义异常
public class NavigationException : Exception{
public NavigationException() {}
public NavigationException(string msg) : base(msg) {}
public NavigationException(string msg, Exception inner) : base(msg, inner) {}
}