C# 在try-catch中使用try-catch好吗?

C# 在try-catch中使用try-catch好吗?,c#,asp.net,.net,c#-4.0,C#,Asp.net,.net,C# 4.0,可能重复: 当前我正在使用try-catch中的try-catch?当前的senario在我们的应用程序中需要它 void MyFun() { try { //Process logic 1 // ...... try { //Process logic 2 // ...... } catch (Exception ex) {

可能重复:

当前我正在使用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
    }
}

此项表明这不是一件坏事,您只需以另一种方式处理错误即可


这方面没有特别的问题,尤其是如果您希望以不同的方式处理异常。
但是,如果内部异常和外部异常分别属于不同类型的
E1、E2
,并且
E1
不是
E2
的父级,则可以有两个相邻的catch子句

try
{
  // do something
}
catch (E1 e1)
{
}
catch (E2 e2)
{
}


正如Rob和J.Steen所指出的,这与问题中的情况略有不同,因为在本例中,
E1
被抛出后,代码将不会被执行。

在不知道这里有什么逻辑的情况下回答这个问题有点困难。
当然,在性能方面,嵌套异常处理会带来更大的成本,但一般的经验法则是只捕获作为开发人员理解如何处理的异常。这与TDD的实践相重叠,如果您有一组足够好的测试,您可以确定预期的异常应该在哪里,那么这将决定您的异常逻辑

我想说:还不错。它是否好取决于您的程序,以及考虑到您的方法的逻辑和契约,这样的概念是否有意义


编辑:我建议查看这篇文章。它概述了CLR中异常管理最昂贵的部分。

我不明白为什么不。如果catch中的逻辑可能会失败或引发需要处理的异常,那么它是有意义的。

嵌套的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;
    }
}
//为了证明我的观点,我举了一个最上面的例子
公共图书馆编号(int x)
{
尝试
{
如果(x>10)
抛出新数字OhighException();
否则如果(x<10)
抛出新的numbertolowexception();
其他的
返回true;
}
捕获(数字高接收)
{
返回false;
}
捕获(numbertoloweexception)
{
返回false;
}
}

我正在尝试思考您可能需要嵌套块的情况。。。如果您正在进行数据库更改,并且将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块,那么可能有更好的方法来设计代码

EDIT:Itay的答案也比嵌套好一些,尽管一旦发现异常,它将不允许您在块中继续


希望这有帮助

这取决于,但通常嵌套的try/catch是完全有效的,正如他所指出的,在内部catch块之后有处理逻辑。如果
过程逻辑1
过程逻辑3
仅抛出
E2
,而
过程逻辑2
抛出
E1
则是相同的。我想,但是,为什么要费心首先编写代码呢?@Rob编写哪种代码?不。如果流程逻辑2抛出异常,流程逻辑3将永远不会执行。这是不一样的。这真的是将例外情况视为if/else吗?将func1()替换为File.Open(path),将func2()替换为MessageBox.Show(“我无法打开您的文件”)-它没有将其视为if-else。也许我举了一个不好的例子。我会想出一个更好、更明确的答案。@Rob,看我更新的示例提示:“下面”或“上面”在你谈论其他答案时并不适用。我可以用不同的方式对答案列表进行排序。但现在我只是吹毛求疵对于多年后遇到这种情况的人,这里有一个存档链接: