在这种情况下,自定义异常是否合适?

时间:2015-10-08 10:30:16

标签: c# exception

我有一段代码可以检查活动目录域是否存在'。我把它放在引号中是因为域名:

  • 可能不存在
  • 可能无法访问/离线

我使用的代码如下:

var directoryEntry = new DirectoryEntry($"LDAP://{domainName}");
if(directoryEntry.Guid == null)
{
    // What exception do I throw here?
}

我知道建议尽可能使用其中一个标准例外。但在这种情况下,自定义异常会更合适吗?即DomainUnreachableException,因为我不确定this表中列出的是否合适。

编辑,仅针对一些上下文,我所展示的代码是设置对象以供进一步使用的方法的一部分。如果不满足某些条件,则该对象基本上不可用。我的条件如下:

  • SQL Server实例不存在或无法访问。 ConnectionFailureException似乎适合此处,因为如果您尝试使用该对象,它会引发什么。
  • 数据库不存在或无法访问。我在这里使用过NullReferenceException,因为如果索引器无法访问或查找数据库,则返回null。
  • 域不存在或无法访问。这是我不确定的。

4 个答案:

答案 0 :(得分:2)

您可以获取该对象,但它的状态在当前操作的上下文中无效,因此InvalidOperationException Class根据其描述是合适的:

  

当方法调用对象的当前状态无效时引发的异常。

如果你已经决定执行一个操作,这个异常适合抛出,这是一个运行方法的“决定”状态。

如果你正在检查Guid == null的方法应该描述一个外部资源,或者它没有做出决定,那么你根本不应该抛出,而是返回一个描述对象。

答案 1 :(得分:1)

当异常捕获代码知道此自定义异常时,创建自定义异常是有意义的,以便它可以执行特定于此异常类型的某些操作。如果在捕获自定义异常后不应执行任何特殊步骤,或者将捕获基类异常,则无需创建新类型。只需将有意义的消息传递给已在FCL中定义的最佳拟合异常类型。

也许您可以使用ActiveDirectoryOperationException

答案 2 :(得分:1)

在正确描述发生的错误时,应该抛出标准异常。 ArgumentExceptionArgumentNullExceptionInvalidOperationException通常是一个不错的选择。

在您的情况下,您可以考虑投掷ArgumentException。如果仅在域不存在时抛出异常,那将是一个不错的选择。但是,当域存在但您无法访问时,也会抛出它。因此,如果域名正确,也会抛出ArgumentException,从而给客户端提供不正确的信息。

在这种情况下,抛出自定义异常似乎是一个不错的选择。我不知道任何完全适合您案例的标准例外。

永远不要抛出ExceptionApplicationException。客户端将无法正确处理这些异常(catch(Exception)将捕获方法中抛出的任何异常,而不仅仅是您抛出的异常。

修改

正如Kapol注意到ActiveDirectoryOperationException可能是一个不错的选择。

在抛出这样的特殊异常时,您必须考虑客户对您的方法的了解。如果他们知道这是一个AD操作,您可以抛出AD异常。如果AD隐藏在某些抽象背后,抛出它将导致抽象漏洞。

答案 3 :(得分:0)

创建一个类似于DriveNotFoundException A drive is unavailable or does not exist.的自定义异常,将其命名为DomainNotFoundEcxeption,并从Exception继承。