目前我在try catch中使用try catch?目前的Senario在我们的申请中要求它。
void MyFun()
{
try
{
//Process logic 1
// ......
try
{
//Process logic 2
// ......
} catch (Exception ex)
{
//write an error details in database
}
//Process Logic 3
// ......
} catch (Exception ex)
{
//show error msg
}
}
答案 0 :(得分:14)
没有特别的问题,特别是如果你想以不同的方式处理异常
但是,如果内部异常和外部异常分别具有不同类型E1, E2
且E1
不是E2
的父类,则可以有两个相邻的catch子句。
try
{
// do something
}
catch (E1 e1)
{
}
catch (E2 e2)
{
}
正如Rob和J.Steen所述 - 这与问题中的情况略有不同,因为在这种情况下,E1
会在代码被抛出之后被抛出。
答案 1 :(得分:1)
嵌套的try / catch很好。你想要远离的是改变基于try catch的代码的逻辑流程。换句话说,您不应将try / catch视为if / else块。所以这不太理想:
//over the top example just to demonstrate my point
public bool IsNumberTen(int x)
{
try
{
if(x > 10)
throw new NumberTooHighException();
else if(x < 10)
throw new NumberTooLowException();
else
return true;
}
catch(NumberTooHighException)
{
return false;
}
catch(NumberTooLowException)
{
return false;
}
}
答案 2 :(得分:0)
这个项目暗示它不是坏事,你只需要以任何方式处理错误。
答案 3 :(得分:0)
在不知道这里有什么逻辑的情况下回答这个问题有点困难。 当然,就性能而言,嵌套异常处理会产生更高的成本,但一般的经验法则只是捕获您作为开发人员理解如何处理的异常。这与TDD的实践重叠,如果你有足够好的测试集,你可以确定预期的异常应该在哪里,那么这将决定你的异常逻辑。
答案 4 :(得分:0)
我会说:这不错。它是否好取决于你的程序,以及根据你的方法的逻辑和契约,这样的概念是否有意义。
修改:我建议查看文章Exception Cost: When to throw and when not to。它概述了CLR中异常管理最昂贵的内容。
答案 5 :(得分:0)
我不明白为什么不。如果你在catch中有逻辑可能会失败或引发需要处理的异常,那么它是有道理的。
答案 6 :(得分:0)
我试图想一下你可能想要一个嵌套块的情况......也许你正在进行数据库更改而你正在使用try catch作为虚拟事务,你可能想尝试更新一些属性但是然后如果失败则继续,但如果实际提交数据库更新本身,也会捕获一个整体异常。
即使考虑到这一点,你也不应该这样做......简单地将块叠加在一起就足够了:
void MyFun()
{
try
{
//Process logic 1
// ......
} catch (Exception ex)
{
//show error msg
}
try
{
//Process logic 2
// ......
} catch (Exception ex)
{
//write an error details in database
}
}
值得注意的是,如果您发现需要嵌套try catch块,那么可能有更好的方法来设计代码。
编辑: Itay的答案也比嵌套好一些,但是一旦你遇到异常,它就不允许你继续进行阻止。
希望这有帮助!