繁体   English   中英

我应该使用哪个.NET异常来发出外部应用程序故障信号?

[英]Which .NET exception should I use for signaling external application failure?

我是新手使用C#和.NET,但我想尝试玩好并重用系统组件。

在我正在维护的代码中,有几个实例我们运行外​​部工具和应用程序,看起来像这样:

using (var Setup = Process.Start(SetupInfo) )
{
    Setup.WaitForExit(SetupTimeout);
    if (!Setup.HasExited )
        throw new TimeoutException(
            "Setup did not complete within the expected time");
}

我正在尝试添加退出代码的验证以及那些具有明确定义的退出代码的外部工具,即'using'块中的类似内容:

switch ( Setup.ExitCode )
{
    case 0: 
        break;
    case 1: 
        throw new SetupFailedException("Setup execution failed");
    case 2: 
        throw new SetupFileNotFound("Setup did not find required files");
    default: 
        throw new ExternalErrorException("Setup failed for some other reason");
}

...前两个派生于泛型'ExternalErrorException'。 但是,是否存在一些我可以重复使用的现有通用异常,即表示外部进程未能按预期运行,而不是发明我自己的?

我不认为有一个你可以重复使用。

我认为抛出自己的异常更有价值,它可以让你具体化。 您的基本异常使用也是我喜欢做的事情。

抛出一个专用的异常类型只有在调用堆栈的某个地方有代码才能捕获异常并处理失败时才有意义。 处理这样的严重错误是非常困难的,你不知道为什么安装程序会像这样行为不端。

这使得它可能存在继续执行代码的小点,事情就走下坡路从那里。 毕竟,一个基本的程序没有安装,当你尝试使用它时,很容易抛出更多的异常。 现在没有一个很好的解释为什么它失败了, 真正的原因是安装程序无法正常工作。

或者,如果这只是一个不会影响主程序的辅助操作,则需要向用户报告,以便她可以联系IT支持人员以找出解决问题的方法。

这两者都不需要一组专用的异常类型。 只捕获您知道如何从中恢复的异常。

你为什么抛出异常? 根据您的说法,您似乎有特定的逻辑需要根据设置的结果执行。 Exception 不是表示业务逻辑的方式。 如果有的话,我会有一个与退出代码相对应的枚举,然后可以检查。

如果你真的需要删除堆栈并且一直有一个Exception泡泡,你可以让你的方法从枚举中返回一个值,然后有一个包装器方法,它将取值,然后映射到一个Exception ,应该抛出。

最后,如果您认为使用自定义Exception是正确的方法,那么您不应该有一个深度Exception层次结构 相反,您将直接从Exception派生。

由于其他人已经质疑你的动机,我不会这样做。 我喜欢你经常感到被迫重用.NET异常,因为这是感觉最大的OOP,但这有时是一个借口,因为我可能是懒惰的。

有很多人会说你的异常越冗长,那么消费代码的应用程序/开发人员就会越好,特别是如果你完全评论你的异常类。

正如Hans所说 ,在这里为每个案例创建自定义异常类型没有多大意义,因为调用代码不太可能对不同的结果案例起作用。 如果可能的话,我会更进一步避免使用甚至一个自定义异常类型。

就个人而言,我会对所有情况使用System.Runtime.InteropServices.ExternalException ,只需将失败原因(如果基于退出代码和/或其他数据可用)添加到异常消息中。 如果您需要为特定情况添加子类,则可以从ExternalException派生而不是自定义类型。

暂无
暂无

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

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