🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#11.错误处理 在项目中,当报错时,会加载相应的错误页面。当我们throw一个异常的时候,将自定义的错误页面进行加载。 首页创建一个自定义的错误异常的模板 ```cpp |-app 前台 | |-views 存放所有的页面 | | |-error 错误目录 | | | |-error.php 错误页面 <?php /** * 错误页面 * User: find35.com * Date: 15/12/26 * Time: 下午7:46 */ echo "<h2>这里是自定义的异常报错模板:".$msg."<h2>"; ``` 然后我们开始创建一个自定义的错误类 ```cpp |-core 框架核心目录 | |-MyException.class.php 用户自定义的错误异常类 <?php /** * 用户自定义的错误异常类 * User: find35.com * Date: 15/12/26 * Time: 下午7:48 */ class MyException extends Exception { /** * 错误页面加载 * @param $msg */ public function showError($msg){ $err_dir = 'app/views/error/error.php'; //判断错误页面是否存在 if(file_exists($err_dir)){ require $err_dir; } } } ``` 然后我们开始在项目中使用它,首先在app类中使用 ```cpp |-core 框架核心目录 | |-App.class.php URL重写类 <?php /** * Created by PhpStorm. * User: find35.com * Date: 15/12/25 * Time: 上午10:53 */ class App { protected static $controller = 'Home';//控制器名 protected static $method = 'index';//方法名 protected static $pams = array();//其他参数 /** * url重写路由的url地址解析方法 */ protected static function paseUrl(){ if(!empty($_GET['url'])){ $url = explode('/',$_GET['url']); //得到控制器 if(isset($url[0])){ self::$controller = $url[0]; unset($url[0]); } //得到方法名 if(isset($url[1])){ self::$method = $url[1]; unset($url[1]); } //判断是否有其他参数 if(isset($url)){ self::$pams = array_values($url); } } } /** * 项目的入口方法 * @throws Exception */ public static function run(){ self::paseUrl(); //得到控制器的路径 $url = 'app/controllers/'.self::$controller.'.class.php'; //判断控制器文件是否存在 if(file_exists($url)){ $c = new self::$controller; }else{ throw new MyException('控制器不存在'); } //执行方法 if(method_exists($c,self::$method)){ $m = self::$method; $new_pams = array(); $num = count(self::$pams); //传递参数,判断是否有参数 if($num > 0){ //判断传递的参数的数量是否是2的倍数 if($num % 2 == 0){ //将参数进行处理 for($i=0;$i<$num;$i+=2){ $new_pams[self::$pams[$i]] = self::$pams[$i+1]; } }else{ throw new MyException('非法参数!'); } } $c->$m($new_pams); }else{ throw new MyException('方法不存在'); } } /** * 自动加载类方法 * @param $className * @throws Exception */ public static function myAutoloader($className){ //控制器类文件目录 $controller = 'app/controllers/'.$className.'.class.php'; //模型类文件目录 $model = 'app/models/'.$className.'.class.php'; //核心类文件目录 $core = 'core/'.$className.'.class.php'; if(file_exists($controller)){ require_once $controller; }else if(file_exists($model)){ require_once $model; }else if(file_exists($core)){ require_once $core; }else{ throw new MyException('类文件不存在'); } } } ``` 最后我们在入口文件中也是用它 ```cpp |-index.php 项目前台入口文件,单一入口 <?php /** * Created by PhpStorm. * User: find35.com * Date: 15/12/24 * Time: 下午5:15 */ echo "<meta charset='utf-8'>"; require_once 'core/App.class.php'; //注册一个 spl_autoload_register(array('App','myAutoloader')); try{ App::run(); throw new MyException(); }catch(MyException $e){ $e->showError(($e->getMessage())); } ``` 此时我们在浏览器中输入 ```cpp http://localhost/php_mvc//home2/index ``` 如果返回的如下,则表示成功 ```cpp 这里是自定义的异常报错模板:控制器不存在 ```