处理此异常情况的最佳做法

时间:2010-01-21 15:11:48

标签: c# exception-handling

让我们说methodA和methodB都会抛出几种类型的异常,有些异常属于同一类型,有些则不是,那么处理这种情况的最佳做法是什么?

风格A:

void foo()
    {
        try
        {
            methodA();
        }
        catch (exceptionTypeA)
        {
            handleA;
        }

        try
        {
            methodB();
        }
        catch (exceptionB)
        {
            handleB;
        }
    }

风格B:

void foo()
    {
        try
        {
            methodA();
            methodB();
        }
        catch (exceptionTypeA)
        {
            handleA;
        }
        catch (exceptionB)
        {
            handleB;
        }
    }

8 个答案:

答案 0 :(得分:11)

两者都不“更好”;他们只是不同。根据您在catch块中执行的操作,即使methodB抛出methodA类型的异常,第一个选项也允许exceptionTypeA执行,而第二个块需要methodA成功,以便methodB被调用。

答案 1 :(得分:4)

这取决于你的意图。

如果methodA可以抛出exceptionB(反之亦然),并且您也希望处理这些异常,请使用样式B.

如果您不希望methodA抛出exceptionB(反之亦然),或者此时尚未准备好处理它,请使用样式A来防止异常被无意中捕获并从中隐藏呼叫者。

答案 2 :(得分:2)

在您的特定情况下,这取决于您想要做什么:

如果您想在MethodA或MethodB发生异常的任何地方停止执行,那么您将转到第二条路线。

如果你想在MethodA完成后(成功或不成功)执行MethodB,那么你就是第一种方式。

答案 3 :(得分:1)

您的示例代码不相同。在您的第一个示例中,A methodB()将始终执行,而在示例B中,如果A抛出则不会执行。

根据这种不同的语义,您需要决定使用哪种“样式”。

答案 4 :(得分:1)

这取决于exceptionTypeB是否未继承exceptionTypeA

因此,如果您是.NET的新手,并且不确定从什么继承,那么通常 StyleA 可能是“首选”。

Style B中,您需要先捕获更具体的异常,然后更常见的异常。

StyleB 更“高效”,导致两个 try catch 块更多的资源和时间只有一个。

答案 5 :(得分:1)

两个示例之间的主要区别在于,在第二个示例中,如果methodA();抛出异常,则不会执行methodB();。在您的第一个示例中,methodA();methodB();都将被执行,无论methodA();是什么,都会失败。因此,这不是造型问题,而是期望问题。如果你无论如何都要执行methodB();,那么第一个例子就是你。如果methodB();methodA();发生时失败,那么示例二就是了。

答案 6 :(得分:1)

取决于,代码似乎暗示methodA和methodB将分别只抛出exceptionTypeA和exceptionB。鉴于我通常会使用第二种方法。

然而,行为存在差异。如果methodA上发生异常,您是否希望执行methodB?在第一个示例中,即使在methodA中发生了excpetion,它也将执行methodB。在第二个例子中,它不会。

我发现第二个例子不那么混乱,更容易阅读,但功能差异当然更重要。

答案 7 :(得分:0)

我更喜欢方法B,但有时方法A是必要的。例如,如果methodA和methodB都可以抛出相同的异常,但你需要知道哪一个抛出了catch块。