#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
这里是自定义的异常报错模板:控制器不存在
```