让我们说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;
}
}
答案 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块。