APi接口实战:try、catch、finally 用法总结

前言#

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

try、catch、finally 执行顺序#

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,

代码说明与示例#

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

# 热爱Java的Phper
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;
    }
}

输出结果:

输出:a=4
[2022-06-17 06:27:14] local.INFO: catch ======== res:2  
[2022-06-17 06:27:14] local.INFO: finally ======== res:3
    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;
        }
    }
输出: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 还是会执行,这样就使得实现相同效果的代码量更加少。

欢迎关注我的公众号#

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。