Php 为什么要使用;最后";关键词?
我理解“finally”关键字在各种语言中的用途,但是,我很难理解为什么在taste中没有格式偏好的情况下使用它 例如,在PHP中:Php 为什么要使用;最后";关键词?,php,error-handling,try-catch,Php,Error Handling,Try Catch,我理解“finally”关键字在各种语言中的用途,但是,我很难理解为什么在taste中没有格式偏好的情况下使用它 例如,在PHP中: 试试看{ possibleErrorThrownFunction(); } 捕获(CustomException$CustomException){ //处理自定义错误 } 捕获(异常$Exception){ //处理错误 } 最后{ //无论是否出错,每次都运行此代码 } 这段代码和这段代码有什么区别 试试看{ possibleErrorThrownFunct
试试看{
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-而在其他时候,你不能完全处理异常。比如,你在捕获中做了一点事情(可能会记录它或向异常对象添加一些详细信息),但随后会重新抛出异常,以便更高级别的人能够捕获它并正确处理它。同样,最终会清理。要比较和对比问题中的两个片段,可能值得一提的是哪一个