PHP之异常处理的概念

2021-02-14 14:18

阅读:622

YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

标签:ida   efault   turn   分享   null   head   图片   alt   二次   

1.前言

异常表示程序运行与自我预期不一致,与错误是两种概念,且异常必须被手动抛出。

代码分享:https://github.com/mtdgclub/tryCatch

1.1异常和错误区别

错误没办法在调用的时候向上传递,必须马上处理;异常则可以。

错误在触发的时候,必须对脚本做一个错误处理;异常可以自定义处理错误信息。

2.异常的基本语法结构

2.1基本语法代码块

try{
//代码段
}catch(Exception $e){
//捕捉异常并处理
}

举例:

getMessage();
}

技术图片

注意:PDO是有内置异常类的,比如PDO连接

try{
    $pdo=new PDO("mysql:host=localhost;dbname=mysql",‘root‘,‘‘);
    var_dump($pdo);
    echo ‘continue....‘;
}catch(PDOException $e){
    echo $e->getMessage();
}

技术图片

抛出异常,程序就不向下执行了

2.2自定义异常类

举例:

";
        $message.="

".__CLASS__."[{$this->code}]:{$this->message}

"; return $message; } }

测试:

getMessage(),‘
‘; echo $e; }

技术图片

2.3 PHP多个catch进行异常捕获 

getMessage();
}catch(Exception $e){
    echo $e->getMessage();
}
echo ‘continue.....‘;

注意:测试捕获多个异常,建议把基类放在最后捕获

2.4案例:自定义文件写入异常处理类

code) {
            case 0:
                return ‘没有提供文件‘;
                break;
            case 1;
                return ‘文件不存在‘;
                break;
            case 2:
                return ‘不是一个文件‘;
                break;
            case 3:
                return ‘文件不可写‘;
                break;
            case 4:
                return ‘非法文件的操作模式‘;
                break;
            case 5:
                return ‘数据写入失败‘;
                break;
            case 6:
                return ‘文件不能被关闭‘;
                break;
            default:
                return ‘非法‘;
                break;
        }
    }
}

class WriteData
{
    private $_message = ‘‘;
    private $_fp = null;

    public function __construct($filename = null, $mode = ‘w‘)
    {
        $this->_message = "
文件:{$filename}
模式:{$mode}"; if (empty($filename)) { throw new FileException($this->_message, 0); } if (!file_exists($filename)) { throw new FileException($this->_message, 1); } if (!is_file($filename)) { throw new FileException($this->_message, 2); } if (!is_writable($filename)) { throw new FileException($this->_message, 3); } if (!in_array($mode, array(‘w‘, ‘w+‘, ‘a‘, ‘a+‘))) { throw new FileException($this->_message, 4); } $this->_fp = fopen($filename, $mode); } public function write($data) { if (!fwrite($this->_fp, $data . PHP_EOL)) { throw new FileException($this->_message, 5); } } public function close() { if (!fclose($this->_fp)) { throw new FileException($this->_message, 6); $this->_fp = null; } } }

测试及结果:

write(‘this is a test‘);
    $fp->close();
    echo "数据写入成功~";
}catch(FileException $e){
    echo "出问题了".$e->getMessage()."
详细信息如下:".$e->getDetails(); }

技术图片

2.5记录与发送异常信息

getMessage(),3,‘testLogException.log‘);
    }
}

//测试
try{
    $link=mysqli_connect(‘localhost‘,‘root‘,‘root123‘,‘mysql‘);
    if(!$link) {
        throw new LogExeception(‘数据库连接失败‘);
    }
}catch(LogExeception $e){
    echo $e->getMessage();
}

测试及结果:

技术图片

3.自定义异常处理器

使用set_exeption_handler()函数,该函数是设置一个用户定义的异常处理函数.

3.1第一次测试:不声明自定义异常处理器

getMessage();
}

function exeption_handler_2($e)
{
    echo ‘自定义的异常处理器2‘;
    echo ‘异常信息:‘ . $e->getMessage();
}

throw  new Exception(‘测试‘);

技术图片

如何处理没有被捕获的异常信息,在异常报错前声明自定义异常处理器。

3.2第二次测试:声明自定义异常处理器

getMessage();
}
function exeption_handler_2($e){
    echo ‘自定义的异常处理器2‘;
    echo ‘异常信息:‘.$e->getMessage();
}
//声明自定义异常处理器
set_exception_handler(‘exeption_handler_1‘);
throw  new Exception(‘测试‘);

技术图片

//自定义异常处理器后面声明会覆盖前面声明
set_exception_handler(‘exeption_handler_1‘);
set_exception_handler(‘exeption_handler_2‘);
throw  new Exception(‘测试‘);

技术图片

//声明自定义异常处理器
set_exception_handler(‘exeption_handler_1‘);
set_exception_handler(‘exeption_handler_2‘);
//恢复到上一次定义过的异常处理函数
restore_exception_handler();
throw  new Exception(‘测试‘);

技术图片

注意:使用自定义异常处理器,调用了,程序就不再向下执行

3.3第三次测试:封装自定义异常处理器类

_exception = $e;
    }

    public static function handle(Exception $e)
    {
        $self = new self($e);
        $self->log();
        echo $self;
    }

    public function log()
    {
        error_log($this->_exception->getMessage() . PHP_EOL, 3, $this->_logFile);
    }

    public function __toString()
    {
        $message =Title

出现异常了,信息如下

刷新一下试试

联系管理员看看747245429@qq.com

EOF; return $message; } } //测试 set_exception_handler(array(‘ExceptionHandler‘,‘handle‘)); throw new Exception(‘测试自定义异常处理器hello world‘);

技术图片

技术图片

放到try{}catch(){}中也可以调用到

技术图片

4.像处理异常一样处理PHP错误

4.1使用PHP定义的错误异常类ErrorException

getMessage();
}

技术图片

4.2自定义错误异常类

getMessage();
}

技术图片

我们也可以设定处理级别,如下:

set_error_handler(array(‘ErrorToException‘,‘handle‘));
//只有警告级别才交给其处理
set_error_handler(array(‘ErrorToException‘,‘handle‘),E_USER_WARNING|E_WARNING);

4.3发生错误如何重定向到404页面

_exception=$e;
    }

    public static function handle(Exception $e){
        $self=new self($e);
        $self->log();
        while(@ob_end_clean());
        //PHP 实现307重定向的方式
        header(‘HTTP/1.1 307 Temporary Redirect‘);
        //发送一个报头,告诉浏览器当前页面不进行缓存,每次访问必读取最新数据
        header(‘Cache-Control:no-cache,must-revalidate‘);
        //内容过期时间
        header(‘Expires:Sat,28 Mar 2015 13:28:48 GMT‘);
        //强制重定向相对路径
        header(‘Location:‘.$self->redirect);
        exit(1);
    }
    public function log(){
        error_log($this->_exception->getMessage().PHP_EOL,3,$this->logFile);
    }
}
set_exception_handler(array(‘ExceptionRedirectHandler‘,‘handle‘));

$link=mysqli_connect(‘localhost‘,‘root‘,‘root123‘,‘mysql‘);
if(!$link){
    throw new Exception(‘数据库连接失败‘);
}

技术图片

技术图片

5.总结

通过本章回顾,再次认识到了异常和错误的区别、并了解了异常的基本语法、懂得如何制定一个异常类、并完成了自定义文件写入异常处理类案例、用error_log记录与发送异常信息和自定义异常处理器set_exeption_handler()函数使用及封装,希望通过本次学习,能够更好地掌握异常处理相关的函数和方法。

来源:站长

PHP之异常处理的概念

标签:ida   efault   turn   分享   null   head   图片   alt   二次   

原文地址:https://www.cnblogs.com/1994july/p/12994319.html


评论


亲,登录后才可以留言!