Php 扩展:什么&x27;最后的关键词是什么?

Php 扩展:什么&x27;最后的关键词是什么?,php,Php,好的,我理解给出的“可接受的答案”,但是我仍然不清楚我应该在最后的代码块中放什么样的代码 如果使用finally是为了得到抛出的未捕获的异常,并为用户提供系统未爆炸的一般错误消息,那么如果捕获了某个异常,不会为用户显示两条错误消息吗 [编辑] 正如@MarkBaker所说,“finally”不是用于捕获未捕获的异常,一般的捕获(Exception$e)就是这样做的。所以有什么用?或者,换句话说,在没有finally的try/catch块之后,finally块做了什么我不能做的事情?也许下面的解释

好的,我理解给出的“可接受的答案”,但是我仍然不清楚我应该在最后的代码块中放什么样的代码

如果使用finally是为了得到抛出的未捕获的异常,并为用户提供系统未爆炸的一般错误消息,那么如果捕获了某个异常,不会为用户显示两条错误消息吗

[编辑]


正如@MarkBaker所说,“finally”不是用于捕获未捕获的异常,一般的捕获(Exception$e)就是这样做的。所以有什么用?或者,换句话说,在没有finally的try/catch块之后,finally块做了什么我不能做的事情?

也许下面的解释可以更好地帮助您理解它的工作原理:

try {
    function1();//this might throw an exception
    function2();//if we want function2 to be executed regardless 
                //if an exception was thrown from function1() - this 
                //is not a good place to call it!
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    function2();//then the right place to write it will be in a finally clause.
}

当从
function1()
-
function2()
引发异常时,将不执行该异常-执行将“跳转”到catch部分。如果我们希望执行
function2()
,而不管是否引发错误,例如,如果
function1()
打开到数据库的连接并运行一些select,然后
function2()
关闭该连接,那么我们最好调用
function2()
catch

后面的
finally
块中,以下解释可能会更好地帮助您理解它的工作原理:

try {
    function1();//this might throw an exception
    function2();//if we want function2 to be executed regardless 
                //if an exception was thrown from function1() - this 
                //is not a good place to call it!
} catch (Exception $e) {
    echo $e->getMessage();
} finally {
    function2();//then the right place to write it will be in a finally clause.
}

当从
function1()
-
function2()
引发异常时,将不执行该异常-执行将“跳转”到catch部分。如果我们希望执行
function2()
,而不管是否引发错误,例如,如果
function1()
打开到数据库的连接并运行一些select,然后
function2()
关闭该连接,那么我们最好调用
function2()
catch

后面的
finally
块中,无论try/catch块的结果如何,“finally”块都应包含要执行的代码。例如,如果尝试查询数据库并捕获错误,则无论数据库操作是否成功,您都可能希望关闭数据库连接。见下文:

open_database_conn();
try{
  query_database();
  return_result();
}
catch(Exception $e){
  echo $e->getMessage();
}
finally{
  close_database_conn();
}

不管try/catch块的结果如何,“finally”块都应该包含您想要执行的代码。例如,如果尝试查询数据库并捕获错误,则无论数据库操作是否成功,您都可能希望关闭数据库连接。见下文:

open_database_conn();
try{
  query_database();
  return_result();
}
catch(Exception $e){
  echo $e->getMessage();
}
finally{
  close_database_conn();
}

使用
finally
并不是
获取抛出的未捕获异常并给出一般错误消息,您可以使用一般
捕获(异常$e)
来实现这一点
finally
适用于无论是否捕获异常(例如关闭文件句柄)都很常见的代码。我不知道是否有特定于PHP的答案,或者是否可以使用try/catch/finally最佳实践@MikeB-我认为,当这个人说即使try/catch块退出或抛出另一个异常,finally也会执行时,你所放置的链接的“接受答案”可能会解决问题,这就是区别,因为所有其他代码都不会,但我在这里尝试了,如果我退出或在try或catch块内抛出另一个异常,那么finally和代码的其余部分(在这些块之后的任何部分)具有相同的行为。@MarkBaker-我不知道常规catch(异常$e)如何获得未捕获的异常。我必须创建与异常类抛出的名称完全相同的catch块,如果我可以预见“抛出新异常”和“抛出新AnyException”,则永远不会产生任何未捕获的异常。您的catch块不必是“确切名称”:异常具有扩展层次结构,当所有扩展都扩展为
Exception
作为它们的曾祖代时,那么
catch(Exception$e)
将捕获任何未被catch中其他显式异常类名显式捕获的异常。如果我有3个不同的子异常,它们都扩展了PDO_异常,那么一个
catch(PDO_异常$e)
将捕获这三个异常中的任何一个。最后
的使用不是
为了得到抛出的未捕获异常并给出一般错误消息,您可以使用一般
catch(异常$e)
finally
适用于无论是否捕获异常(例如关闭文件句柄)都很常见的代码。我不知道是否有特定于PHP的答案,或者是否可以使用try/catch/finally最佳实践@MikeB-我认为,当这个人说即使try/catch块退出或抛出另一个异常,finally也会执行时,你所放置的链接的“接受答案”可能会解决问题,这就是区别,因为所有其他代码都不会,但我在这里尝试了,如果我退出或在try或catch块内抛出另一个异常,那么finally和代码的其余部分(在这些块之后的任何部分)具有相同的行为。@MarkBaker-我不知道常规catch(异常$e)如何获得未捕获的异常。我必须创建与异常类抛出的名称完全相同的catch块,如果我可以预见“抛出新异常”和“抛出新AnyException”,则永远不会产生任何未捕获的异常。您的catch块不必是“确切名称”:异常具有扩展层次结构,当所有扩展都扩展为
Exception
作为它们的曾祖代时,那么
catch(Exception$e)
将捕获任何未被catch中其他显式异常类名显式捕获的异常。如果我有3个不同的子异常,它们都扩展了PDO_异常,那么一个
catch(PDO_异常$e)
将捕获这三个异常中的任何一个。即使不存在finally块,并且在try/catch块之后,function2()也将执行。唯一的方法是如果function1()抛出一个异常