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,看我更新的示例提示:“下面”或“上面”在你谈论其他答案时并不适用。我可以用不同的方式对答案列表进行排序。但现在我只是吹毛求疵对于多年后遇到这种情况的人,这里有一个存档链接: