PHP 异常处理
1,基本代码:try…catch,throw
try {
throw new Exception() //throw new 类名(这里写出现异常后应该怎么做的代码)
} catch (Exception $e) {
}
1)当你觉得代码可能出错时,可以把代码放进try中,然后在catch写当try中的代码出错时应该怎么做。
2)try只是尝试执行某一块代码,如果出现异常情况需要手动抛出异常(throw),抛出异常后catch就能捕捉到
【注】try-catch 是一种结构,一个try至少对应一个catch,try和catch之间不能加任何代码。
3)主要流程:
程序正常运行try结构的代码,如果try中抛出异常,try中抛出异常后面的代码不再执行,那么就会执行catch中的代码,然后继续向下执行。
4)官方的异常处理:
Exception:是所以异常类的基类,当自定义异常处理类时需要先继承这个类
例:
class LoginException extends Exception
Exception类里面的方法:
getFile() //获取出现异常的文件目录
getCode() //获取异常的错误码
getLine() //获取错误行号
getMessage() //获取自定义的错误信息
<?php
try {
throw new Exception('出现异常',404);
} catch (Exception $e) {
echo $e->getFile()."<br/>";
echo $e->getCode()."<br/>";
echo $e->getLine()."<br/>";
echo $e->getMessage()."<br/>";
}
运行结果:
完整实例(来自菜鸟教程):
<?php
// 创建一个有异常处理的函数
function checkNum($number)
{
if($number>1)
{
throw new Exception("变量值必须小于等于 1");
}
return true;
}
// 在 try 块 触发异常
try
{
checkNum(2);
// 如果抛出异常,以下文本不会输出
echo '如果输出该内容,说明 $number 变量';
}
// 捕获异常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
2,自定义异常处理类
<?php
class LoginException extends Exception{
function demo()
{
echo'已经反馈给管理员<br/>';
}
};
try {
echo '我是普通用户<br/>';
echo '我正在登陆<br/>';
throw new LoginException('出现登陆异常<br/>');
echo '欢迎管理员';
} catch (LoginException $e) {
echo $e->getMessage();
$e->demo();
}
运行结果:
代码分析:
当普通用户登陆时,会抛出异常,然后运行catch里面的代码,打印出错误信息和运行自定义类里面的方法
【注意1】当使用多个catch自定义异常类时,官方的异常类:Exception需要放在最后,因为所有的自定义异常类都继承了Exception,Exception是使用自定义异常类的父类,当放在前面时,一旦Exception捕获到了异常,下面的自定义类就不会执行
【注意2】Exception官方类里面的方法基本都是用final来修饰的,无法重写。
final:如果用来修饰类,那么代表这个类不能被继承,如果用来修饰方法,代表这个方法不能被重写
只能通过魔术方法:
_toString()自定义错误方法出来。
错误1的例子:
<?php
class LoginException extends Exception{
function demo()
{
echo'已经反馈给管理员<br/>';
}
};
try {
echo '我是普通用户<br/>';
echo '我正在登陆<br/>';
throw new LoginException('出现登陆异常<br/>');
echo '欢迎管理员';
}
catch (Exception $e) {
echo '111<br/>' ;
}
catch (LoginException $e) {
echo $e->getMessage();
$e->demo();
}
3,自定义异常处理函数
<?php
function text($e)
{
echo $e->getmessage();
}
set_exception_handler('text');
throw new Exception('出现异常了');
这样子就可以直接抛出异常,不需要手动捕获,因为自定义错误函数会自动捕获。
4,多个异常
当出现多个异常时可以使用多个 if…else 代码块,或一个 switch 代码块,或者嵌套多个异常(try,catch,throw里面都可以嵌套try-catch,类似与if…else的if,else里面可以嵌套if…else一样)。这些异常能够使用不同的 exception 类,并返回不同的错误消息
实例1(来自菜鸟教程):
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
// 检测邮箱
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new customException($email);
}
// 检测 "example" 是否在邮箱地址中
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email 是 example 邮箱");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>
5,重新抛出异常
有时,当异常被抛出时,您也许希望以不同于标准的方式对它进行处理。可以在一个 “catch” 代码块中再次抛出异常。
实例(来自菜鸟教程):
<?php
class customException extends Exception
{
public function errorMessage()
{
// 错误信息
$errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。';
return $errorMsg;
}
}
$email = "someone@example.com";
try
{
try
{
// 检测 "example" 是否在邮箱地址中
if(strpos($email, "example") !== FALSE)
{
// 如果是个不合法的邮箱地址,抛出异常
throw new Exception($email);
}
}
catch(Exception $e)
{
// 重新抛出异常
throw new customException($email);
}
}
catch (customException $e)
{
// 显示自定义信息
echo $e->errorMessage();
}
?>