PHP try catch的用法(附带实例)
在前面的开发中,当程序出现错误时,如果想要提前退出程序,可以使用 exit 语句实现。然而在实际开发中,这种方式会给用户带来不好的体验,也不利于调试程序。
针对错误的处理,PHP 提供了异常处理机制,通过该机制可以使用面向对象的方式处理异常。在项目中合理地运用异常处理机制可以提高程序的健壮性,当发生错误时调试程序也会更加方便。
PHP 提供了 Exception 类表示程序中的异常,通过实例化该类可以创建异常对象,创建后的异常对象使用 throw 关键字抛出,语法格式如下:
使用 try catch 语句可以捕获程序中抛出的异常并进行处理,try catch 语句的语法格式如下:
值得一提的是,catch 块后面还可以添加 finally 块,无论程序是否发生异常,finally 块中的代码都会执行。如果不需要 finally 块,可以将其省略。
在使用 try catch 语句时,应注意以下事项:
为了让读者更好地理解异常的抛出和捕获,下面通过代码进行演示,具体步骤如下:
1) 在 VS Code 编辑器中打开 C:\web\apache2.4\htdocs,创建 exception01.php 文件,具体代码如下:
2) 在 try 块调用 division() 函数。调用 division() 函数时,将第 2 个参数设为 0,在 catch 块输出异常信息,在 finally 块中换行输出“异常处理完成”,具体代码如下:
通过浏览器访问 exception01.php,运行结果为:
下面演示多异常的捕获处理,创建 exception03.php文件,具体代码如下:
例如,PHP 抛出的异常信息对用户来说并不友好,可在捕获异常后,再次抛出异常,返回给用户更加友好的提示信息。
下面演示异常嵌套,创建 exception04.php 文件,具体代码如下:
针对错误的处理,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 语句时,应注意以下事项:
- 每个 try 块应至少有一个对应的 catch 块或 finally 块。catch 块可以有多个,用于针对不同的异常类型进行处理,捕获到异常后执行对应的 catch 块。
- 发生异常时,PHP 会尝试查找第一个匹配的 catch 块来执行,如果直到脚本结束时都没有找到匹配的 catch 块且无 finally 块,将会出现 Fatal error 错误。
为了让读者更好地理解异常的抛出和捕获,下面通过代码进行演示,具体步骤如下:
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地址不合法 }在上述代码中:
- 第 5 行代码判断 $email 是不是一个合法的 E-mail 地址,不合法时执行第 6 行代码抛出 Exception 异常,然后执行第 13 行代码输出异常信息;
- 第 7 行代码判断 $email 的域名部分是否为“example.com”,如果是,执行第 8 行代码抛出 MyException 异常,然后执行第 11 行代码输出异常信息。
异常嵌套
异常嵌套是指在一个 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(); // 输出结果:发生异常,请稍后再试 }在上述代码中:
- 第 5 行代码抛出了 Exception 异常;
- 第 6~8 行的 catch 块对 Exception 异常进行处理,并在第 7 行代码再次抛出 MyException 异常;
- 第 9~11 行的 catch 块对 MyException 异常进行处理。