引入异常机制时,需要想清楚下面几个问题
1、有哪些代码需要使用异常? 理论上讲,异常可以用在任意地方,但是如果滥用异常,会导致异常链比较复杂,异常处理也比较低效
2、是否所有异常都需要处理? 内核部分,应该由php自行处理,业务部分,更倾向于向外抛出异常,使异常更容易被观察
3、如何处理?捕获吞掉还是向外抛出?同上
框架结构中对异常处理的设计 – 异常的统一处理,分拣处理,自定义处理 引入对异常的统一处理,一般在框架的 bootstrap 脚本中进行对异常的接管.
代码语言:javascript复制//自定义的异常处理方法
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类接管异常
代码语言:javascript复制<?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('CoreCore::autoLoad');
// 设置用户自定义的错误处理函数
set_error_handler('CoreCore::appError');
// 设置用户自定义的异常处理函数
set_exception_handler('CoreCore::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;
}
}