我有一段代码可以检查活动目录域是否存在'。我把它放在引号中是因为域名:
我使用的代码如下:
var directoryEntry = new DirectoryEntry($"LDAP://{domainName}");
if(directoryEntry.Guid == null)
{
// What exception do I throw here?
}
我知道建议尽可能使用其中一个标准例外。但在这种情况下,自定义异常会更合适吗?即DomainUnreachableException
,因为我不确定this表中列出的是否合适。
编辑,仅针对一些上下文,我所展示的代码是设置对象以供进一步使用的方法的一部分。如果不满足某些条件,则该对象基本上不可用。我的条件如下:
ConnectionFailureException
似乎适合此处,因为如果您尝试使用该对象,它会引发什么。NullReferenceException
,因为如果索引器无法访问或查找数据库,则返回null。答案 0 :(得分:2)
您可以获取该对象,但它的状态在当前操作的上下文中无效,因此InvalidOperationException Class根据其描述是合适的:
当方法调用对象的当前状态无效时引发的异常。
如果你已经决定执行一个操作,这个异常适合抛出,这是一个运行方法的“决定”状态。
如果你正在检查Guid == null
的方法应该描述一个外部资源,或者它没有做出决定,那么你根本不应该抛出,而是返回一个描述对象。
答案 1 :(得分:1)
当异常捕获代码知道此自定义异常时,创建自定义异常是有意义的,以便它可以执行特定于此异常类型的某些操作。如果在捕获自定义异常后不应执行任何特殊步骤,或者将捕获基类异常,则无需创建新类型。只需将有意义的消息传递给已在FCL中定义的最佳拟合异常类型。
答案 2 :(得分:1)
在正确描述发生的错误时,应该抛出标准异常。 ArgumentException
,ArgumentNullException
,InvalidOperationException
通常是一个不错的选择。
在您的情况下,您可以考虑投掷ArgumentException
。如果仅在域不存在时抛出异常,那将是一个不错的选择。但是,当域存在但您无法访问时,也会抛出它。因此,如果域名正确,也会抛出ArgumentException
,从而给客户端提供不正确的信息。
在这种情况下,抛出自定义异常似乎是一个不错的选择。我不知道任何完全适合您案例的标准例外。
永远不要抛出Exception
或ApplicationException
。客户端将无法正确处理这些异常(catch(Exception)
将捕获方法中抛出的任何异常,而不仅仅是您抛出的异常。
修改强>
正如Kapol注意到ActiveDirectoryOperationException可能是一个不错的选择。
在抛出这样的特殊异常时,您必须考虑客户对您的方法的了解。如果他们知道这是一个AD操作,您可以抛出AD异常。如果AD隐藏在某些抽象背后,抛出它将导致抽象漏洞。
答案 3 :(得分:0)
创建一个类似于DriveNotFoundException A drive is unavailable or does not exist.
的自定义异常,将其命名为DomainNotFoundEcxeption,并从Exception继承。