# 在單元測試顯示例外(Show Exception in CLI)
在 Laravel 5 做單元測試時,使用 try catch 丟出例外時,Laravel 5 會自動地將例外的錯誤訊息處理成網頁的樣式呈現,這樣的好處是在網頁中做操作發生例外狀況時,可以直接看到例外的錯誤訊息,但是在寫單元測試 (Unit test) 時,他只會將這些錯誤先記錄在 log 檔案裡面(`storage/log/laravel-yyyy-mm-dd.log`),我們要看到這些錯誤的狀況必須要再另開終端機去執行 `php artisan tail` 去觀看這些 例外 Log 的狀況,這樣在做測試的時候是相當麻煩的。
在 Laravel 5 中所有的例外(Exception)都會被丟到 `app/Exceptions/Handler.php` 中的 `render()` 去處理
~~~
<?php
// app/Exceptions/Handler.php
class Handler extends ExceptionHandler {
/**
* Render an exception into an HTTP response.
* 將例外錯誤轉為 HTTP 回應
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
return parent::render($request, $e);
}
}
~~~
我們如果需要在 CLI 就顯示例外錯誤訊息的話,必須修改 `render()` 函式,而我想要保有原本在網頁做除錯的彈性,所以我在環境變數 `.env` 檔案中加入例外處理(Exception)顯示的開關,當有設定開啟時,才直接顯示例外訊息。
~~~
<!-- .env -->
EXCEPTION_DISPLAY_SWITCH=true
~~~
`.env` 設定好後,就將 `render()` 函式修改為這樣
~~~
<?php
// app/Exceptions/Handler.php
class Handler extends ExceptionHandler {
/**
* Render an exception into an HTTP response.
* 將例外錯誤轉為 HTTP 回應
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
// 預設不直接顯示例外訊息
$exception_display_switch = env('EXCEPTION_DISPLAY_SWITCH', false);
if ($exception_display_switch) {
throw $e;
}
return parent::render($request, $e);
}
}
~~~
這樣設定完後,也保留原本系統處理例外狀況的彈性,也可以讓我在單元測試(Unit test)中可以正常的去顯示例外訊息了!!
### 參考資料
- [錯誤與日誌 - laravel.tw](http://laravel.tw/docs/5.0/errors)
- [how do I create custom error page in laravel 5](http://stackoverflow.com/questions/28689629/how-do-i-create-custom-error-page-in-laravel-5)
- [Laravel 5.0 - Custom Error Pages](https://mattstauffer.co/blog/laravel-5.0-custom-error-pages)
- 介紹
- 環境
- .env 檔案
- 資料庫
- Migration (遷移)
- Eloquent Model (模型)
- 設定
- 關聯
- 魔術函式
- 使用 Eloquent
- 常見問題
- 無法取得查詢 Log
- 使用大量資料的方式新增時無法新增
- 使用中繼模型繼承 Eloquent 模型造成無法使用大量資料新增
- PostgreSQL
- 安裝 PostgreSQL ODBC driver
- HTTP
- 請求
- 中介層 (Middleware)
- 視圖 (View)
- 服務
- 認證登入(Auth)
- 郵件(Mail)
- 使用 Gmail 寄信
- 使用 Mailgun 寄信
- 隊列(Queue)
- database
- 非同步(async)
- 輔助方法 (Helpers)
- 自定義輔助方法
- 單元測試 (Unit Test)
- Post CSRF 錯誤
- 錯誤與日誌
- 在單元測試顯示例外
- 日誌記錄層級
- 日誌巨集
- 加密
- 雜湊
- Elixir
- 使用 Elixir 合併 CSS 與 JS
- 設計模式
- 服務容器
- PSR
- Model 模型
- 學習資源
- 套件
- Debug
- Artisan tail
- 工具
- Carbon
- 設計模式
- 其他常見問題
- Call to undefined method getCachedCompilePath()
- 變更專案目錄名稱導致 View 無法讀取
- Laravel 5.1 目錄結構異動
- 學習資源
- 官方
- 社群
- 會議議程
- 工作
- 文件
- 文章
- 套件
- 服務工具
- 教學影片
- 教學網站
- 編輯開發
- 主機
- 成功案例