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 异常参考手册。
该参考手册包含所有异常方法的描述和实例。