#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
這里是自定義的異常報錯模板:控制器不存在
```