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

时间:2011-05-06 13:09:02

标签: c# exception .net-4.0

我是使用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");
}

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

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'。但是有一些现有的通用异常我可以为此重复使用,即表示外部进程未能按预期运行,而不是发明我自己的吗?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

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

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

最终,如果您认为使用自定义Exception是正确的方法,那么you should not have a deep Exception hierarchy。相反,您可以直接从Exception派生。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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