首页 > 编程笔记 > PHP笔记 阅读:5

PHP try catch的用法(附带实例)

在前面的开发中,当程序出现错误时,如果想要提前退出程序,可以使用 exit 语句实现。然而在实际开发中,这种方式会给用户带来不好的体验,也不利于调试程序。

针对错误的处理,PHP 提供了异常处理机制,通过该机制可以使用面向对象的方式处理异常。在项目中合理地运用异常处理机制可以提高程序的健壮性,当发生错误时调试程序也会更加方便。

PHP 提供了 Exception 类表示程序中的异常,通过实例化该类可以创建异常对象,创建后的异常对象使用 throw 关键字抛出,语法格式如下:
$e = new Exception('异常信息');
throw $e;
上述语法格式可以简写成“throw new Exception('异常信息');”。创建异常对象后,使用异常对象的 getMessage() 方法可以获取异常信息。

使用 try catch 语句可以捕获程序中抛出的异常并进行处理,try catch 语句的语法格式如下:
try {
    // 可能会抛出异常的代码
} catch (Exception $e) {
    // 进行异常处理的代码
}
在上述语法格式中,try 块中包含可能会出现异常的代码,当 try 块中的代码发生异常时,程序会跳转到对应的 catch 块,在 catch 块接收 Exception 类的对象 $e。

值得一提的是,catch 块后面还可以添加 finally 块,无论程序是否发生异常,finally 块中的代码都会执行。如果不需要 finally 块,可以将其省略。

在使用 try catch 语句时,应注意以下事项:
为了让读者更好地理解异常的抛出和捕获,下面通过代码进行演示,具体步骤如下:
1) 在 VS Code 编辑器中打开 C:\web\apache2.4\htdocs,创建 exception01.php 文件,具体代码如下:
<?php
function division($num1, $num2)  
{
    if (!$num2) {
        throw new Exception('除数不能为0'); // 抛出异常
        echo '抛出异常后,后面的代码不执行。'; // 测试此行代码是否会执行
    }
    return $num1 / $num2;
}
上述代码定义了 division() 函数,函数的参数 $num1 是被除数,$num2 是除数,第 4~8 行代码判断如果除数为 0 则抛出异常。其中,第 5 行代码实例化了异常对象并使用 throw 关键字抛出异常。

2) 在 try 块调用 division() 函数。调用 division() 函数时,将第 2 个参数设为 0,在 catch 块输出异常信息,在 finally 块中换行输出“异常处理完成”,具体代码如下:
try {
    echo division(1, 0);  // 调用函数
    echo '当上一行代码抛出异常时,后面的代码不会执行';
} catch (Exception $e) {  // Exception表示异常类,$e表示异常对象
    echo $e->getMessage(); // 获取异常信息
} finally {
    echo '<br>异常处理完成';
}
echo '<br>异常处理完成后,后面的代码会继续执行';
在上述代码中,调用 division() 函数时,除数为 0,该函数会抛出异常。在 division() 函数中创建异常对象时,传入了异常信息“除数不能为0”,在 catch 块中就可以通过 $e->getMessage() 获取异常信息。

通过浏览器访问 exception01.php,运行结果为:

除数不能为0
异常处理完成
异常处理完成后,后面的代码会继续执行

多异常捕获处理

一个 try 块除了对应一个 catch 块外,还可以对应多个 catch 块。在 catch 块中使用 throw 关键字抛出异常时,可以使用不同的异常类对象返回不同的描述信息。

下面演示多异常的捕获处理,创建 exception03.php文件,具体代码如下:
<?php
require './MyException.php';
$email = 'tom@example.com';
try {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new Exception(' E-mail地址不合法');
    } elseif (substr($email, strrpos($email, '@') + 1) === 'example.com'){
        throw new MyException('不能使用example.com作为邮箱地址');
    }
} catch (MyException $e) {
    echo $e->getCustomMessage();   // 输出结果:不能使用example.com作为邮箱地址
} catch (Exception $e) {
    echo $e->getMessage();         // 输出结果:E-mail地址不合法
}
在上述代码中:

异常嵌套

异常嵌套是指在一个 try 块中嵌套 try…catch 语句。

例如,PHP 抛出的异常信息对用户来说并不友好,可在捕获异常后,再次抛出异常,返回给用户更加友好的提示信息。

下面演示异常嵌套,创建 exception04.php 文件,具体代码如下:
<?php
require './MyException.php';
try {
    try {
        throw new Exception();
    } catch (Exception $e) {
        throw new MyException('发生异常,请稍后再试');
    }
} catch (MyException $e) {
    echo $e->getMessage(); // 输出结果:发生异常,请稍后再试
}
在上述代码中:

相关文章