Php 为什么要使用;最后";关键词?

Php 为什么要使用;最后";关键词?,php,error-handling,try-catch,Php,Error Handling,Try Catch,我理解“finally”关键字在各种语言中的用途,但是,我很难理解为什么在taste中没有格式偏好的情况下使用它 例如,在PHP中: 试试看{ possibleErrorThrownFunction(); } 捕获(CustomException$CustomException){ //处理自定义错误 } 捕获(异常$Exception){ //处理错误 } 最后{ //无论是否出错,每次都运行此代码 } 这段代码和这段代码有什么区别 试试看{ possibleErrorThrownFunct

我理解“finally”关键字在各种语言中的用途,但是,我很难理解为什么在taste中没有格式偏好的情况下使用它

例如,在PHP中:

试试看{
possibleErrorThrownFunction();
}
捕获(CustomException$CustomException){
//处理自定义错误
}
捕获(异常$Exception){
//处理错误
}
最后{
//无论是否出错,每次都运行此代码
}
这段代码和这段代码有什么区别

试试看{
possibleErrorThrownFunction();
}
捕获(CustomException$CustomException){
//处理自定义错误
}
捕获(异常$Exception){
//处理错误
}
//无论是否出错,每次都运行此代码
由于错误被捕获,最后一行不总是运行吗?在这种情况下,没有必要真正使用
finally
,除非您只想维护代码样式的格式

举一个例子,如果我在这里遗漏了一些东西,那么一个
finally
语句是必要的,并且与在try/catch语句之后放置代码不同,这将非常有用

简短回答
最后
块保证在允许程序崩溃之前,无论
try
catch
块内部发生什么情况,都能运行

这里有点解释:虽然解释不是特别详细

更多细节 我脑海中浮现的一个例子是,如果您处理的是输入/输出流或类似的东西,在使用后必须关闭,以避免内存泄漏。要使用您的示例:

try {
  memoryUser.startReading(someFileOrSomething);
}
catch (CustomException $customException) {
  // handle custom error
}
catch (Exception $exception) {
  // handle the error
  invisibleBug.whoops(); // i.e. something goes wrong in this block
}

memoryUser.Close(); // because something went wrong in the catch block,
                    // this never runs, which, in this case, causes a memory leak
在本例中,包装
memoryUser.Close()finally
块中的code>将确保该行在程序其余部分爆炸之前运行,从而防止内存泄漏,即使在发生灾难性故障时也是如此

TL;博士 所以很多时候,人们把最后一个拦截器放在那里,以确保一条重要的线路运行,即使他们忽略了拦截器中的某些东西。这就是我一直看到它被使用的方式


希望这会有所帮助:)

最后{}
块的特殊之处在于它总是在
try{}
块的末尾运行

  • 如果
    try{}
    块中的代码成功完成,它将运行

  • 如果
    try{}
    块中的代码抛出一个被
    catch{}
    捕获的异常,那么它将运行。(
    finally{}
    catch{}
    之后运行)

  • 如果
    try{}
    块中的代码抛出了任何
    catch{}
    块都没有处理的异常,或者根本没有异常,那么它将运行。(在异常传播到调用方之前,
    finally{}
    块将运行。)

  • 如果
    try{}
    块中的代码抛出异常,而
    catch{}
    中的代码抛出另一个异常(或重新抛出相同的异常),则将运行该程序

  • 如果
    try{}
    块中的代码或
    catch{}
    块中的代码使用
    return
    ,它甚至会运行。(与未捕获异常一样,
    finally{}
    在函数实际返回之前运行。)
    finally{}
    块甚至可以使用
    return
    本身,其返回值将覆盖另一个块尝试返回的值


(有一种边缘情况是,
finally{}
块不会运行,即如果整个进程被破坏,例如被终止,或者调用
exit()
die()

finally将始终执行,不管是否引发异常。这通常用于清理任务,如解锁文件或编译器(PHP)本身不做的事情。正如@MarkusZeller所述,它通常用于清理。查看java文档以了解详细信息:@MarkusZeller php是解释的,而不是编译的。如果您抛出的异常不是由任何catch子句处理的,或者如果您从任何处理程序中抛出的异常,那么catch子句后面的代码将永远不会执行,而在异常进一步传播到调用之前,将执行finally块stack@bassxzero是的,(PHP)代码被解释,但最终它被编译成字节码。这并不会改变finally的行为。为了确保我理解您所传达的内容,我没有看到的情况是当catch语句中出现错误时;在这种情况下,即使出现新的未捕获错误,finally语句仍然可以运行?这意味着,您实际上应该使用finally语句,因为您不能总是预测catch语句中的错误?虽然语法似乎是Java,但这是一个很好的示例和解释。确切地说:)如果catch非常简单,那么当您可能不需要finally块时,另一个可能的例外是(比如
System.out.println(“啊哦”);
但我通常只希望安全,而不是抱歉:)@adam谢谢你,好眼力。我更熟悉Java,但我想这个概念会是一样的。@Jake-有时候你也不写catch块。比如
试试{…}最后{…}
。然后异常会向上传播(用其他方法捕获),但是
最终
块会运行,清理需要清理的任何东西。@Jake-而在其他时候,你不能完全处理异常。比如,你在
捕获中做了一点事情(可能会记录它或向异常对象添加一些详细信息),但随后会重新抛出异常,以便更高级别的人能够捕获它并正确处理它。同样,
最终会清理。要比较和对比问题中的两个片段,可能值得一提的是哪一个