学习web的第13天

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();
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值