2016-12-11 165 views
1

在Laravel中,無論何時出現錯誤,即使是次要的NOTICES,WARNINGS和DEPRECATED erros,我都可以獲得完整的調試信息,從而終止應用程序。在我的App.config中,我調試了debug => false,並且收到了'Whoops'的消息,看起來像是出錯了。Laravel關掉異常處理程序

如何關閉所有錯誤處理,但Laravel只是得到不會中斷整個應用程序流程的正常PHP錯誤?

回答

2

App\Exceptions\Handler.php文件就是爲此而構建的。

public function render()方法,可以捕獲應用程序和執行某些重定向/網頁瀏覽,如果你選擇:

舉例來說,你可以在你的應用程序捕獲HttpException的,然後如果你想返回錯誤頁面:

public function render($request, Exception $e) 
{ 
    //other stuff 

    if ($e instanceof HttpException) { 
     return view('errors.general')->withErrors([ 
      'message' => 'The application encountered an error!' 
     ]); 
    } 

    return parent::render($request, $exception); 
} 
+1

讀這個問題,然後你的綽號讓我咯咯笑,因爲它正是我讀過它後想的:)無論如何,+1從我的正確答案。 –

1

如果你不想打斷你對某種PHP錯誤類型的工作流程,你需要禁用通過Laravel這些錯誤登記錯誤處理程序。

Laravel在Illuminate/Foundation/Bootstrap/HandleExceptions.php中註冊其錯誤處理。該引導程序是您的Http內核處理請求時調用的幾個引導程序之一。

雖然有兩種方法可以做你想做的事情,但我認爲最簡單的方法就是處理在引導程序被調用後觸發的事件。在事件處理程序中,您可以重置錯誤處理程序以查找您不希望Laravel處理的錯誤。

在你bootstrap/app.php文件,添加以下行返回$app權利之前:

$app->afterBootstrapping(
    'Illuminate\Foundation\Bootstrap\HandleExceptions', 
    function ($app) { 
     set_error_handler(function ($level, $message, $file = '', $line = 0, $context = []) { 
      // Check if this error level is handled by error reporting 
      if (error_reporting() & $level) { 
       // Return false for any error levels that should 
       // be handled by the built in PHP error handler. 
       if ($level & (E_WARNING | E_NOTICE | E_DEPRECATED)) { 
        return false; 
       } 

       // Throw an exception to be handled by Laravel for all other errors. 
       throw new ErrorException($message, 0, $level, $file, $line); 
      } 
     }); 
    } 
); 
1

說起來,投票的答案是什麼,他問相反。 據我所知,沒有辦法分開錯誤報告和laravel接管渲染屏幕。我一直在瀏覽Laravel 5的代碼,並沒有找到一種方法來使用它們的設置將它們分開。

你可以編寫自己的庫來完全接管所有的錯誤處理並刪除所有的laravels內部跟蹤,但是在你需要原始頁面錯誤的情況下,你必須確保將它傳遞迴laravel處理。最簡單的方法是找到第三方錯誤處理程序供應商,然後修改它來接管所有錯誤處理程序並且不阻止呈現。