## php異常托管 和 錯誤托管
跟 `php` 的 自動加載差不多。
`spl_register_autoload`: 類找不到,將調用此函數。
`set_exception_handler`: 異常,將調用此函數。
`set_error_handler`: 錯誤將調用此函數。
`session_set_save_handler`: `session` 調用此函數。
....
分別可以說是: `類找不到托管` `異常托管` `錯誤托管` `session托管`
(`自定義session` 本教程不寫)
本篇講的是: `異常托管` 和 `錯誤托管`
## 創建core/HandleExceptions.php
```
<?php
namespace core;
use App\exceptions\ErrorMessageException;
use App\exceptions\RunErrorException;
use Throwable;
class HandleExceptions
{
// 要忽略記錄的異常 不記錄到日志去
protected $ignore = [
];
public function init()
{
// 所有異常到托管到handleException方法
set_exception_handler([$this, 'handleException']);
// 所有錯誤到托管到handleErorr方法
set_error_handler([$this,'handleErorr']);
}
// 見:https://www.runoob.com/php/php-error.html
public function handleErorr($error_level, $error_message, $error_file,$error_line,$error_context)
{
// app函數見: "添加函數文件helpers.php" 這篇文章
app('response')->setContent(
'死機 都死機 自動開機 關機 重啟再死機 三星手機 蘋果手機 所有都死機 全世界只剩小米.....'
)->setCode(500)->send();
// 記錄到日志
app('log')->error(
$error_message.' at '.$error_file.':'.$error_file
);
}
// 異常托管到這個方法
public function handleException(Throwable $e)
{
if( method_exists($e,'render')) // 如果自定義的異常類存在render()方法
app('response')->setContent(
$e->render()
)->send();
if(! $this->isIgnore($e)){ // 不忽略 記錄異常到日志去
app('log')->debug(
$e->getMessage().' at '.$e->getFile().':'.$e->getLine()
);
// 顯示給開發者看 以便查找錯誤
echo $e->getMessage().' at '.$e->getFile().':'.$e->getLine();
}
}
// 是否忽略異常
protected function isIgnore(Throwable $e)
{
foreach ($this->ignore as $item)
if( $item == get_class($e))
return true;
return false;
}
}
```
## 創建app/exceptions/HandleExceptions.php
繼承基礎的異常處理類,因為 `core` 的代碼一般不給用戶改。
讓客戶去改 `app`文件夾的代碼。
```
<?php
namespace App\exceptions;
use core\HandleExceptions as BaseHandleExceptions;
class HandleExceptions extends BaseHandleExceptions
{
// 要忽略記錄的異常 不記錄到日志去
protected $ignore = [
ErrorMessageException::class
];
}
```
## 綁定到容器

## 啟動異常 錯誤托管

至此已經完成了,接下來運行下異常。
## 運行異常
### 創建app/exceptions/ErrorMessageException.php
```
<?php
namespace App\exceptions;
use Exception;
// 錯誤消息返回
class ErrorMessageException extends Exception
{
public function render()
{
return [
'data' => $this->getMessage(),
'code' => 400
];
}
}
```
### 取消這個異常的記錄app/exceptions/HandleExceptions.php

### 運行


## 運行錯誤



- 前言
- 基礎篇
- 1. 第一步 創建框架目錄結構
- 2. 引入composer自動加載
- 3. php自動加載 (解釋篇)
- 4. 創建容器 注冊樹模式
- 5. 關于psr規范解釋
- 6. 關于"容器" "契約" "依賴注入" (解釋篇)
- 7. 添加函數文件helpers.php
- 8. 初始化請求(Request)
- 9. 響應 (Response)
- 10. 路由一 (路由組實現)
- 11. 路由二 (加入中間件)
- 12. 配置信息 (類似laravel)
- 13. 數據庫連接 (多例模式)
- 14. 查詢構造器 (query builder)
- MVC實現
- M 模型實現 (數據映射 + 原型 模式)
- C 控制器實現 + 控制器中間件
- V 視圖實現 (Laravel Blade 引擎)
- V 視圖切換成 ThinkPhp 模板 引擎)
- 其他輪子
- 日志
- 自定義異常 (異常托管)
- 單元測試 (phpunit)
- 替換成swoole的http服務器
- 協程上下文解決request問題
- qps測試
- 發布到packagist.org