2016-09-29 80 views
0

我noticied,我經常寫這樣的事情Laravel抓PDOException/Handler.php

class SitesController 
{ 
    public function update(SiteRequest $request, Site $site) 
    { 
     try { 
      $site->update($request->all()); 

      return redirect()->route('sites.index'); 
     } catch (PDOException $e) { 
      return redirect() 
       ->back() 
       ->with('error', 'Cannot update site'); 
     } 
    } 

    public function destroy(Site $site) 
    { 
     try { 
      $site->delete(); 

      return redirect()->route('sites.index'); 
     } catch (PDOException $e) { 
      return redirect() 
       ->back() 
       ->with('error', 'Cannot remove site'); 
     } 
    } 
} 

我能趕上在app/Exceptions/Handler.php這樣PDOException?想法不錯 ?有什麼缺點?有沒有辦法只捕獲從app/Http/Controllers文件夾中拋出 的PDOException?

// app/Exceptions/Handler.php 
public function render($request, Exception $e) 
{ 
    if (!App::runningInConsole() && $e instanceof PDOException) { 
     return back()->with('error', 'Could not perform the operation'); 
    } 

    return parent::render($request, $e); 
} 

回答

0

很多問題..你試過了嗎?

是的,你可以,如果這是抓住它的最後一個實例。如果您在代碼中需要更深層次的內容,請在此處使用它。

我喜歡這種方法適用於所有'用戶面對異常' - 這不應該被看到 - ,而不是我嘗試並希望在代碼的更深層次上捕獲的東西。

在這裏,你可以組織這些例外,看看你不會扔在用戶身上。

對於最後一個問題,可能...,如果你找到一種方法來檢查異常拋出的位置..類似debug_backtrace()[1] ['功能'],但那很可能不工作在這裏...並在if語句中使用它。

但是你可能不希望這樣,因爲如果在代碼中的任何級別拋出某個異常,我不認爲你想根據它是否在控制器中而以不同的方式處理它。相反,你想顯示某些例外,而不是其他例子,請確定你真的想要那個,然後我會在控制器中捕獲異常並返回你想要返回的結果。

附加: 你可能不只是想壓制輸出,但也可能是日誌記錄。如果是這樣,那麼把它放在$ dontReport數組中進一步處理該Handler文件,並在報告方法中創建一個如下所示的行: if (in_array(get_class($e), $this->dontReport)) return parent::report($e);