繁体   English   中英

在这种情况下是否适合使用自定义例外?

[英]Is a custom exception suitable in this case?

我有一段代码可以检查活动目录域是否“存在”。 我将其用引号引起来,因为该域:

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

我使用的代码如下:

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

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

编辑(仅出于上下文考虑),我显示的代码是设置对象以备将来使用的方法的一部分。 如果不满足某些条件,则该对象基本上是不可用的。 我的条件如下:

  • SQL Server实例不存在或不可访问。 ConnectionFailureException在这里似乎很合适,因为如果您尝试使用该对象,则会抛出该异常。
  • 数据库不存在或不可访问。 我在这里使用了NullReferenceException ,因为如果索引器无法访问或找到数据库,则它返回null。
  • 域不存在或不可访问。 这是我不确定的那个。

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

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

如果您已经决定执行某项操作(该状态是方法运行的“已决定”状态),则适合抛出此异常。

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

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

也许您可以使用ActiveDirectoryOperationException

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

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

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

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

编辑

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

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

使一个类似于DriveNotFoundException A drive is unavailable or does not exist.自定义异常DriveNotFoundException A drive is unavailable or does not exist. 将其命名为DomainExceptionFoundEcxeption继承自Exception。

暂无
暂无

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

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