在try catch中使用try catch是否很好?

时间:2012-12-07 08:53:08

标签: c# asp.net .net c#-4.0

  

可能重复:
  Are nested Try/Catch blocks a bad idea?

目前我在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
    }
}

7 个答案:

答案 0 :(得分:14)

没有特别的问题,特别是如果你想以不同的方式处理异常 但是,如果内部异常和外部异常分别具有不同类型E1, E2E1不是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)

这个项目暗示它不是坏事,你只需要以任何方式处理错误。

Exception handling try catch inside catch

答案 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的答案也比嵌套好一些,但是一旦你遇到异常,它就不允许你继续进行阻止。

希望这有帮助!