我最近遇到过一个程序员编写的代码,他在catch中有一个try-catch语句!
请原谅我无法粘贴实际代码,但他所做的与此类似:
try
{
//ABC Operation
}
catch (ArgumentException ae)
{
try
{
//XYZ Operation
}
catch (IndexOutOfRangeException ioe)
{
//Something
}
}
我个人觉得这是我见过的最差的代码! 在1到10的范围内,你认为我应该多久去给他一点心思,还是我过度反应?
编辑: 他实际上在捕获中做了什么,他正在执行一些操作,这些操作可以/应该在初始尝试失败时完成。我的问题是拥有干净的代码和可维护性。将第一个catch中的异常委托给另一个函数或调用函数就可以,但是添加更多代码可能会或者可能不会将异常抛入第一个catch,这是我觉得不好的。我试图避免多个堆叠的“if-loop”语句,我发现这同样糟糕。
答案 0 :(得分:135)
为什么那么糟糕?它在概念上与:
没有什么不同void TrySomething() {
try {
} catch (ArgumentException) {
HandleTrySomethingFailure();
}
}
void HandleTrySomethingFailure() {
try {
} catch (IndexOutOfRangeException) {
}
}
在你去那里并给他一块脑子(尝试顶叶,特别令人反感)之前,你究竟要对他说些什么?你如何回答众所周知的“为什么?”
更具讽刺意味的是,当抖动内联此代码时,它看起来与您的示例完全相同。
-Oisin
答案 1 :(得分:21)
以下是一个案例:
try{
//Dangerous Operation
} catch (AnyException ae) {
try {
//Do rollback which can fail
} catch (RollbackFailedException rfe) {
//Log that
}
} finally {
try {
//close connection but it may fail too
} catch (IOException ioe) {
//Log that
}
}
与@ x0n说的差不多。您可能需要在尝试关闭资源时或在尝试解决另一个异常带来的情况时处理异常。
答案 2 :(得分:16)
不知道代码是什么,这是不可能的。但要做到这一点并不是不寻常。
e.g。如果你必须在处理异常时清理资源,那么清理代码本身可能会抛出异常。