1、簡介
開始一個新的Lumen項目的時候,錯誤和異常處理已經默認為你配置好了。此外,Lumen還集成了提供各種功能強大日志處理器的Monolog日志庫。
2、配置
2.1 錯誤詳情
配置文件.env
中的APP_DEBUG配置選項控制瀏覽器顯示的錯誤詳情數量。
對本地開發而言,你應該設置環境變量APP_DEBUG
值為true
。在生產環境,該值應該被設置為false
。
3、異常處理器
所有異常都由類App\Exceptions\Handler
處理,該類包含兩個方法:report
和render
。下面我們詳細闡述這兩個方法。
3.1 report方法
report
方法用於記錄異常並將其發送給外部服務如Bugsnag。默認情況下,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響應中
*
* @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.');
該方法可在請求生命周期的任何時間點使用。
5、日志
Lumen日志工具基於強大的Monolog庫,默認情況下,Lumen被配置為在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中定義的七種日志級別:alert, critical, error,warning, notice, info 和 debug。
Log::alert($error); Log::critical($error); Log::error($error); Log::warning($error); Log::notice($error); Log::info($error); Log::debug($error);
5.1 上下文信息
上下文數據數組也會被傳遞給日志方法。上下文數據將會和日志消息一起被格式化和顯示:
Log::info('User failed to login.', ['id' => $user->id]);