前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中try、catch、finally 用法总结

PHP中try、catch、finally 用法总结

作者头像
ITer.996
发布2022-11-22 14:54:05
1.1K0
发布2022-11-22 14:54:05
举报
文章被收录于专栏:PHPer技术栈PHPer技术栈

前言

在开发过程中异常处理是经常用到的,相信大部分使用 try、catch、finally 的只知道 try 中出现异常 catch 中会捕获,finally 块中代码何时都会执行。其中还有很多细微的知识点,接下来我们一起学习学习。

try、catch、finally 执行顺序

代码语言:javascript
复制
try {
   // try 主体
 } catch (FirstThrowableType $e) {
   // 捕获异常主体
 } catch (\Exception $exception) {
   // 捕获异常主体
 } finally {
   // finally 主体
 }

  try 块和 catch 块中逻辑基本相同,try 中出现异常 catch 捕获异常并抛出,若 catch 中出现异常则跳转到 finally,try 或 catch 正常执行若存在 return 则先执行 return 的代码并保存返回值信息再执行 finally,若 finally 中出现异常或包含 return 则执行结束,若无异常且没有 return 则会执行 try 或 catch 中的 return 或结束。整体执行流程如下:

代码说明与示例

当 try-catch-finally 中无 return 时,如果 try 块中出现异常则进入 catch 中,执行完 catch 中代码后进入 finally,如果 catch 中出现异常仍然会执行 finally 代码块,finally 块执行结束后抛出异常。try 块中无异常时执行完 try 块直接执行 finally。 以 catch 中抛出异常为例,代码如下:

代码语言:javascript
复制
public function test(){
    $a = 1;
    try {
        $a = 1 / 0;
        app('log')->info("try ======== res:".$a);
        return $a;
    } catch (\Exception $exception) {
        $a++;
        app('log')->info("catch ======== res:".$a);
        return $a;
    } finally {
        $a++;
        app('log')->info("finally ======== res:".$a);
        return $a;
    }
}
代码语言:javascript
复制
输出:a=4
[2022-06-17 06:27:14] local.INFO: catch ======== res:2  
[2022-06-17 06:27:14] local.INFO: finally ======== res:3
代码语言:javascript
复制
 public function test(){
        $a = 1;
        try {
            return $a;
        } catch (\Exception $exception) {
            $a++;
            app('log')->info("catch ======== res:".$a);
            return $a;
        } finally {
            $a++;
            app('log')->info("finally ======== res:".$a);
            return $a;
        }
    }
代码语言:javascript
复制
输出:a=2
[2022-06-17 06:33:39] local.INFO: finally ======== res:2  
  • 如果 catch 里面有 return 或者 try 里面有 return,finally 里面没有 return,最后会 return 前面的第一个 return,非 finally 代码段的 return 后面的代码是不执行的,finally 代码段肯定会执行。
  • 如果 catch 里面有 return 或者 try 里面有 return,finally 里面有 return,非 finally 代码段的 return 后面的代码是不执行的,但是 finally 里面的 return 会覆盖前面 return 的值

总结

finally 使用的意义在于可以在其中处理一些资源的回收等操作。在 catch 中是不方便处理的,特别是在含有多个 catch 段的时候,相同的代码可能需要重复写几次。而且 finally 可以跨越 return 存在,也就是说即使在 catch 或者 try 的代码块中使用 return ,finally 还是会执行,这样就使得实现相同效果的代码量更加少。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHPer技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • try、catch、finally 执行顺序
  • 代码说明与示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档