引入异常机制时,需要想清楚下面几个问题

1、有哪些代码需要使用异常? 理论上讲,异常可以用在任意地方,但是如果滥用异常,会导致异常链比较复杂,异常处理也比较低效

2、是否所有异常都需要处理? 内核部分,应该由php自行处理,业务部分,更倾向于向外抛出异常,使异常更容易被观察

3、如何处理?捕获吞掉还是向外抛出?同上


框架结构中对异常处理的设计 – 异常的统一处理,分拣处理,自定义处理
引入对异常的统一处理,一般在框架的 bootstrap 脚本中进行对异常的接管.

//自定义的异常处理方法 
public static function exceptionHandler($exception){     
        //对异常进行分拣     
    if($exception instanceof BaseException){ 
        //来自自定义基类抛出额异常         ...code     
    }else{ 
        //其他未经过处理的异常         ...code     
    } 
}  
public static function errorHandler($errNo, $errStr, $errFile, $errLine)
{
} 
  //自定义的错误处理方法 

set_exception_handler(['className','exceptionHandler']]);

  //['类名','方法名'] 
set_error_handler(['className','errorHandler']);
 //定义一个基类来统一深入的处理异常 
class BaseException extends \Exception
{     
...... 
}

实现一个简单的框架,异常机制设计 ,一般放在bootstrap类接管异常

<?php
/**
 * Created by : PhpStorm
 * User: Chris青玄
 * Date: 2020/8/19
 * Time: 4:58 下午
 */
namespace Core;

/**
 * 核心引导类
 * Class Core
 * @package Core
 */
class Core
{
    /**
     * 初始化应用程序
     */
    static public function start()
    {
        // 注册自动加载函数
        spl_autoload_register('Core\Core::autoLoad');
        // 设置用户自定义的错误处理函数
        set_error_handler('Core\Core::appError');
        // 设置用户自定义的异常处理函数
        set_exception_handler('Core\Core::appException');
        App::run();
    }

    /**
     * 自动加载
     * @param $class
     */
    static public function autoLoad($class)
    {
        $filename       =   BASE_PATH . str_replace('\\', DIRECTORY_SEPARATOR, $class) . EXT;
        if(is_file($filename)){
                include $filename;
        }

    }

    /**
     * 自定义错误处理函数
     * @param $errno
     * @param $errstr
     * @param $errfile
     * @param $errline
     */
    static public function appError($errno,$errstr,$errfile,$errline)
    {
        //定义错误信息
        $errorType = array(
            E_WARNING  => 'Warning',
            E_NOTICE  => 'NOTICE',
            E_USER_ERROR  => 'USER_ERROR',
            E_USER_WARNING  => 'USER_WARNING',
            E_USER_NOTICE  => 'USER_NOTICE',
        );
        $error = "[TYPE]:".$errorType[$errno].PHP_EOL;
        $error .= "[MSG]:" . $errstr.PHP_EOL;
        $error .= "[FILE]:" . $errfile.PHP_EOL;
        $error .= "[LINE]:" . $errline.PHP_EOL;
        self::halt($error);
    }

    static public function appException($e)
    {
        $error  = "[MSG]:" . $e->getMessage().PHP_EOL;
        $error .= "[FILE]:" . $e->getFile().PHP_EOL;
        $error .= "[LINE]:" . $e->getLine().PHP_EOL;
        self::halt($error);
    }

    /**
     * 输出错误信息
     * @param $error
     */
    static public function halt($error)
    {
        $error .= "[TIME]:".date('Y-m-d H:i:s').PHP_EOL;
        var_dump($error);
        exit;
    }

}