我多年来一直在许多语言中使用try-catch/except-finally变体,今天有人问我finally的意义是什么,我无法回答。
基本上,为什么要在finally中放入一条语句,而不是把它放在整个try-catch块之后呢?或者换句话说,以下代码块之间是否存在差异:
try{ //a}
catch {//b}
finally {//c}
try{//a}
catch{//b}
//c编辑:
各位,我知道什么是最终的功能,我已经使用它很长时间了,但是我的问题是,在上面的例子中,把//c放在最后似乎是多余的,不是吗?
发布于 2012-03-14 00:31:00
finally块的目的是确保代码在三种情况下运行,这三种情况仅使用"catch“块是不能很好地处理的:
try块中的代码通过return catch块中的代码重新抛出捕获的异常,或者--无意或有意--抛出一个新的异常。如果try块内的代码遇到try没有catch的异常,则返回try可以在每次尝试或抛出之前复制finally代码,并将catch块包装在它们自己的return /catch中,以允许意外异常发生的可能性,但放弃所有这些并简单地使用finally块要容易得多。
顺便说一句,我希望语言设计者能够包括finally块的exception参数,以处理在异常后需要清理,但仍然希望它渗透到调用堆栈中的情况(例如,可以将构造函数的代码包装在这样的构造中,如果构造函数要以异常退出,则对构造中的对象执行Dispose操作)。
发布于 2012-03-14 00:24:25
最后,即使try块中抛出异常,也会执行该块。因此,例如,如果您以前打开过一个流,那么无论是否抛出异常,您都可能希望关闭该流。最后,块对于这样的问题很有用。
发布于 2020-10-07 13:43:46
finally是try-catch模式中允许DRY原则的语法糖。如果库代码没有足够的信息来处理某些状态,并且希望客户端代码解决该问题,则通常会引发。如果您没有库-客户端代码分离,那么您可以使用if而不是try来处理所有事情。
让我们看看没有finally的标准情况
void myFunction() {
var r = allocateResources();
r.doSomething();
if(somethingBadHappens) {
freeResources(r);
throw new Exception(CODE42);
}
r.doSomethingMore();
freeResources(r);
}在上面的代码片段中,您重复了freeResources():这可以是您需要重复的多个语句。这个嗅觉和finally代码块是干净代码的解决方案:
void myFunction() {
var r = allocateResources();
try {
r.doSomething();
if(somethingBadHappens) throw new Exception(CODE42);
r.doSomethingMore();
}
finally {
freeResources(r);
}
happyFunction();
}让我们实现三个层次的抽象:
allocateResources()是我们提供myFunction的代码,使用A1allocateResources()-myFunction块中使用myFunction的客户端代码:function A3code() {
try {
myFunction();
doSomething();
}
catch(Exception e) {
// no hanging resources here
Console.WriteLine(e);
}
}现在让我们看看会发生什么:
allocateResources()抛出A1,我们不知道如何在A2中处理它(A2代码可以在无控制台的环境中运行),所以我们将这种情况延迟到A3,而不添加任何进一步的代码。如果此处抛出异常,则不会执行块,因为finally绑定到未输入的try。somethingBadHappens,堆栈将展开到处理此情况的A3,但在它之前执行<>E142>块<>E243,因此如果没有异常,我们不需要重复此操作。我们可以添加<代码>D47块,并尝试解决A1中可能在调用<代码>D48方法时出现的一些潜在异常。通常,我们希望尽快处理异常,使客户端代码(A3)更适合客户端coders.happyFunction()只有在myFunction()中(在try块内部或外部)没有抛出的情况下才会执行。正如@supercat所指出的,如果try块通过return退出,那么finally块也会被执行。我建议你避免这个坏习惯,并且在每个函数中只有一个返回(可能在函数的开始就存在一些早期的返回)。使用单返回函数的原因是:
多个返回的原因是避免许多嵌套的it,但有其他技术可以解决它。Exception%s是此规则中的例外。
https://stackoverflow.com/questions/9687849
复制相似问题