[TOC]
### **1、簡介**
[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")默認已經為我們配置好了[錯誤](http://laravelacademy.org/tags/%e9%94%99%e8%af%af "View all posts in 錯誤")和[異常](http://laravelacademy.org/tags/%e5%bc%82%e5%b8%b8 "View all posts in 異常")處理,此外,Laravel還集成了[Monolog](https://github.com/Seldaek/monolog)[日志](http://laravelacademy.org/tags/%e6%97%a5%e5%bf%97 "View all posts in 日志")庫以便提供多種功能強大的日志處理器。
### **2、配置**
##### **錯誤詳情顯示**
配置文件`config/app.php`中的`debug`配置選項控制瀏覽器顯示的錯誤詳情數量。默認情況下,該配置選項被設置在`.env`文件中的環境變量`APP_DEBUG`。
對本地開發而言,你應該設置環境變量`APP_DEBUG`值為`true`。在生產環境,該值應該被設置為`false`。
##### **日志模式**
Laravel支持日志方法`single`,?`daily`,?`syslog`?和?`errorlog`。例如,如果你想要日志文件按日生成而不是生成單個文件,應該在配置文件`config/app.php`中設置`log`值如下:
~~~
'log' => 'daily'
~~~
##### **自定義[Monolog](http://laravelacademy.org/tags/monolog "View all posts in Monolog")配置**
如果你想要在應用中完全控制Monolog的配置,可以使用應用的`configureMonologUsing`方法。你應該在`bootstrap/app.php`文件返回`$app`變量之前調用該方法:
~~~
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
return $app;
~~~
### **3、異常處理器**
所有異常都由類`App\Exceptions\Handler`處理,該類包含兩個方法:`report`和`render`。下面我們詳細闡述這兩個方法。
#### **3.1 report方法**
`report`方法用于記錄異常并將其發送給外部服務如[Bugsnag](https://bugsnag.com/)。默認情況下,`report`方法只是將異常傳遞給異常被記錄的基類,你可以隨心所欲的記錄異常。
例如,如果你需要以不同方式報告不同類型的異常,可使用PHP的`instanceof`比較操作符:
~~~
/**
* 報告或記錄異常
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e){
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
~~~
##### **通過類型忽略異常**
異常處理器的`$dontReport`屬性包含一個不會被記錄的異常類型數組,默認情況下,`404`錯誤異常不會被寫到日志文件,如果需要的話你可以添加其他異常類型到這個數組。
#### **3.2 render方法**
`render`方法負責將給定異常轉化為發送給瀏覽器的[HTTP](http://laravelacademy.org/tags/http "View all posts in HTTP")響應,默認情況下,異常被傳遞給為你生成響應的基類。然而,你可以隨心所欲地檢查異常類型或者返回自定義響應:
~~~
/**
* 將異常渲染到HTTP響應中
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e){
if ($e instanceof CustomException) {
return response()->view('errors.custom', [], 500);
}
return parent::render($request, $e);
}
~~~
### **4、HTTP異常**
有些異常描述來自服務器的HTTP錯誤碼,例如,這可能是一個“頁面未找到”錯誤(`404`),“認證失敗錯誤”(`401`)亦或是程序出錯造成的`500`錯誤,為了在應用中生成這樣的響應,使用如下方法:
~~~
abort(404);
~~~
`abort`方法會立即引發一個會被異常處理器渲染的異常,此外,你還可以像這樣提供響應描述:
~~~
abort(403, 'Unauthorized action.');
~~~
該方法可在請求生命周期的任何時間點使用。
#### **自定義HTTP錯誤頁面**
Laravel使得返回多種HTTP狀態碼的錯誤頁面變得簡單,例如,如果你想要自定義`404`錯誤頁面,創建一個`resources/views/errors/404.blade.php`文件,給文件將會渲染程序生成的所有`404`錯誤。
改目錄下的視圖命名應該和相應的HTTP狀態碼相匹配。
### **5、日志**
Laravel日志工具基于強大的Monolog庫,默認情況下,Laravel被配置為在`storage/logs`目錄下每日為應用生成日志文件,你可以使用`Log`門面編寫日志信息到日志中:
~~~
<?php
namespace App\Http\Controllers;
use Log;
use App\User;
use App\Http\Controllers\Controller;
class UserController extends Controller{
/**
* 顯示指定用戶的屬性
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
~~~
該日志記錄器提供了[RFC 5424](http://tools.ietf.org/html/rfc5424)中定義的八種日志級別:**emergency**,?**alert**,?**critical**,?**error**,**warning**,?**notice**,?**info**?和?**debug**。
~~~
Log::emergency($error);
Log::alert($error);
Log::critical($error);
Log::error($error);
Log::warning($error);
Log::notice($error);
Log::info($error);
Log::debug($error);
~~~
##### **上下文信息**
上下文數據數組也會被傳遞給日志方法。上下文數據將會和日志消息一起被格式化和顯示:
~~~
Log::info('User failed to login.', ['id' => $user->id]);
~~~
##### **訪問底層Monolog實例**
Monolog有多個可用于日志的處理器,如果需要的話,你可以訪問底層Monolog實例:
~~~
$monolog = Log::getMonolog();
~~~
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統