PHP 异常
什么是异常?
异常是一个描述 PHP 脚本错误或意外行为的对象。
许多 PHP 函数和类都会抛出异常。
用户定义的函数和类也可以抛出异常。
当函数遇到它无法使用的数据时,异常是一个很好的停止函数的方法。
抛出异常
throw 语句允许用户定义的函数或方法抛出异常。当异常被抛出时,其后面的代码将不会被执行。
如果异常没有被捕获,将会出现带有 "Uncaught Exception" 消息的致命错误。
让我们尝试抛出一个没有捕获的异常:
实例
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } echo divide(5, 0); ?>
结果将类似于以下内容:
Fatal error: Uncaught Exception: Division by zero in C:\webfolder\test.php:4 Stack trace: #0 C:\webfolder\test.php(9): divide(5, 0) #1 {main} thrown in C:\webfolder\test.php on line 4
try...catch 语句
为了避免上面的示例中出现的错误,我们可以使用 try...catch
语句来捕获异常并继续处理。
语法
try { 可能抛出异常的代码 } catch(Exception $e) { 当捕获到异常时运行的代码 }
实例
当抛出异常时显示一条消息:
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "无法进行除法运算。"; } ?>
catch
块指示应该捕获哪种类型的异常以及用于访问异常的变量名称。在上面的例子中,异常的类型是 Exception
,变量名称是 $e
。
try...catch...finally 语句
try...catch...finally
语句可以用于捕获异常。finally
块中的代码无论是否捕获到异常都会运行。如果 finally
存在,catch
块是可选的。
语法
try { 可能抛出异常的代码 } catch(Exception $e) { 当捕获到异常时运行的代码 } finally { 无论是否捕获到异常都会运行的代码 }
实例
当抛出异常时显示一条消息,然后指示过程已完成:
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $e) { echo "无法进行除法运算。"; } finally { echo "过程已完成。"; } ?>
实例
即使未捕获到异常也输出一个字符串:
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero"); } return $dividend / $divisor; } try { echo divide(5, 0); } finally { echo "过程已完成。"; } ?>
异常对象
异常对象包含有关函数遇到的错误或意外行为的信息。
语法
new Exception(message, code, previous)
参数值
参数 | 描述 |
---|---|
message | 可选。描述为何抛出异常的字符串。 |
code | 可选。整数,可用于轻松区分同一类型的不同异常。 |
previous | 可选。如果此异常是在另一个异常的 catch 块中抛出的,建议将此异常传递给此参数。 |
方法
当捕获异常时,下表显示了一些可用于获取有关异常信息的方法:
方法 | 描述 |
---|---|
getMessage() | 返回描述为何抛出异常的字符串。 |
getPrevious() | 如果此异常是由另一个异常触发的,此方法返回前一个异常。如果不是,则返回 null。 |
getCode() | 返回异常代码。 |
getFile() | 返回抛出异常的文件的完整路径。 |
getLine() | 返回抛出异常的代码行的行号。 |
实例
输出有关抛出的异常的信息:
<?php function divide($dividend, $divisor) { if($divisor == 0) { throw new Exception("Division by zero", 1); } return $dividend / $divisor; } try { echo divide(5, 0); } catch(Exception $ex) { $code = $ex->getCode(); $message = $ex->getMessage(); $file = $ex->getFile(); $line = $ex->getLine(); echo "在文件 $file 的第 $line 行抛出了异常:[代码 $code] \n$message"; } ?>
完整的异常参考手册
如需获取完整的参考,请访问我们完整的 PHP 异常参考手册。
该参考手册包含所有异常方法的描述和实例。