[英]Passing custom object to RunWorkerCompleted event in case of an exception
[英]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
因为我不确定此表中列出的内容是否合适。
编辑(仅出于上下文考虑),我显示的代码是设置对象以备将来使用的方法的一部分。 如果不满足某些条件,则该对象基本上是不可用的。 我的条件如下:
ConnectionFailureException
在这里似乎很合适,因为如果您尝试使用该对象,则会抛出该异常。 NullReferenceException
,因为如果索引器无法访问或找到数据库,则它返回null。 您可以获取该对象,但是在当前操作的上下文中该对象的状态无效,因此InvalidOperationException类根据其描述是合适的:
当方法调用对于对象的当前状态无效时引发的异常。
如果您已经决定执行某项操作(该状态是方法运行的“已决定”状态),则适合抛出此异常。
如果您正在检查Guid == null
方法应该描述一个外部资源,或者不需要做出决定,那么您根本不应该抛出,而是返回一个描述对象。
当异常捕获代码知道此自定义异常时,创建自定义异常是有意义的,以便它可以执行特定于此异常类型的某些操作。 如果在捕获您的自定义异常后不应该采取任何特殊步骤,否则将捕获基类异常,则无需创建新类型。 只需将有意义的消息传递给FCL中已定义的最合适的异常类型即可。
也许您可以使用ActiveDirectoryOperationException ?
当它们正确描述发生的错误时,您应该抛出标准异常。 ArgumentException
, ArgumentNullException
, InvalidOperationException
通常是一个不错的选择。
在您的情况下,您可以考虑抛出ArgumentException
。 如果仅当域不存在时才引发异常,这将是一个不错的选择。 但是,当域存在但无法访问时,您也会将其抛出。 因此,如果域名正确,也会引发ArgumentException
,从而为客户端提供错误的信息。
在这种情况下,抛出自定义异常似乎是一个不错的选择。 我不知道任何适合您情况的标准例外情况。
而且永远不要抛出Exception
或ApplicationException
。 客户端将无法正确处理这些异常( 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.