ThinkPHP 异常处理

异常处理

系统产生的异常和错误都是程序的隐患,要尽早排除和解决,而不是掩盖。对于应用自己抛出的异常则做出相应的捕获处理
我们在编写代码的时候通常会使用流程语句,当然我们也可以把捕获异常当成流程与就来使用

Tp在调试模式下展示异常页面,显示具体细节,而在部署模式下,仅显示错误信息提示,这么做是为了安全考虑。我们可以手动捕获异常,如果工程量小的情况下可以,但是如果需要捕获异常的地方有很多的话,岂不是要写很多重复的代码,虽然利用公共方法可以解决重复问题,但这不是最优解。系统支持异常处理由开发者自定义类进行接管,需要在应用配置文件app.php中配置参数exception_handle,下面就举例Api接口的异常处理类。

配置异常处理handle类

在应用配置文件app.php

'exception_handle'       => 'app\common\exception\handler\ApiExceptionHandler',

定义异常基类

定义app\common\exception\BaseException.php

<?php
namespace app\common\exception;

use think\Exception;

class BaseException extends Exception
{
    //http 状态码
    public $code = 500;

    //错误码
    public $errCode = 1000;

    //错误消息
    public $errMsg  = '服务器内部错误';

    public function __construct($error = [])
    {
        if( array_key_exists('code',$error) )
            $this->code = $error['code'];

        if( array_key_exists('errCode',$error) )
            $this->errCode = $error['errCode'];

        if( array_key_exists('errMsg',$error) )
            $this->errMsg = $error['errMsg'];
    }
}

定义异常处理Handle类

我们开发Api的时候,经常会验证参数安全,以及手动抛出可视性错误,那么类似这些前端提示性错误可以直接返回前端,并且不需要记录日志。当然如果在开发调试模式的话,可以交给系统处理异常,如果不是开发调试模式,没必要显示具体的错误,比如返回给前端一大串英文错误信息,客户看了一脸懵逼,他也不知道具体错在哪了,交互非常不好,因为客户端根本不关心这些信息。像这种情况,统一返回给客户端提示说服务器内部错误(大部分是我们代码的问题),然后记录日志,由后端人员再去检查代码,处理好完备的逻辑。

定义app\common\exception\handler\ApiExceptionHandler.php

<?php

namespace app\common\exception\handler;

use app\common\exception\BaseException;
use Exception;
use think\exception\Handle;
use think\facade\Env;
use think\facade\Log;

class ApiExceptionHandler extends Handle
{
    //http 状态码
    private $code;

    //错误消息
    private $errMsg;

    //错误码
    private $errCode;

    public function render(Exception $e)
    {
        //表示需要显示具体错误消息的异常类,并不需要记录日志
        if($e instanceof BaseException){
            $this->code    = $e->code;
            $this->errMsg  = $e->errMsg;
            $this->errCode = $e->errCode;
        }else{
            //获取调试信息,如果处于调试状态,则显示具体错误信息,否则统一返回服务器错误消息,并记录日志
            $appDebug = Env::get('app_debug',false);

            //交给系统处理错误
            if( $appDebug ){
                return parent::render($e);
            }

            $this->code = 500;
            $this->errCode = 9999;
            $this->errMsg = '服务器内部错误';

            //记录日志
            $this->recordLog($e);
        }

        $data = [
            'msg'  => $this->errMsg,
            'code' => $this->errCode,
            'data' => '',
        ];
        return json()->data($data)->code($this->code);
    }

    /**
     * 记录错误日志
     * @param Exception $e
     */
    public function recordLog(Exception $e)
    {
        $message = $e->getMessage();
        Log::record($message,'error');
    }
}

至此,异常处理已差不多完成,剩下的就是在实际逻辑中抛出异常,就像上面说的类似流程控制似的,抛出异常的时候就相当于终止了程序,返回给前端错误提示。

本作品采用《CC 协议》,转载必须注明作者和本文链接
今年不学习,明天惨唧唧。
zs4336
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!