2017-05-07 73 views
1

我正在使用laravel 5.4。我有一個類中的方法獲取模型類的新實例。該類的全名在運行時計算,因此計算出的類名不存在。如果該類不存在,我想忽略任何異常,並且我想返回nullLaravel在我嘗試時拋出異常事件,趕上

但是,當異常發生,Laravel仍然拋出該異常甚至低於以爲我相信它不應該

[Symfony的\分量\調試\異常\ FatalThrowableError] 類「應用程序\型號\ CreatedBy」不找到

請注意,字符串App\Models\CreatedBy是在運行時計算的。

這裏是我的代碼

private function getForeignModelInstance() 
{ 
    try { 
     if (!$this->foreignModel) { 
      $model = $this->getFullForeignModel(); 

      if ($model) { 
       $this->foreignModel = new $model(); 
      } 
     } 

     return $this->foreignModel; 
    } catch (\Exception $e) { 
     return null; 
    } 
} 

怎能無視拋出的任何錯誤,並通過返回null解決?

+0

抓住'Throwable'而不是'Exception' – MoeinPorkamel

+0

'FatalThrowableError'擴展'Exception'我相信所以它不應該有所作爲。即使我嘗試過,但得到相同的錯誤。 –

+0

我遇到同樣的問題,除了我在數據庫遷移內部,所以我真的需要能夠可靠地運行一些清理代碼。我不認爲「嘗試防止發生異常」類型的解決方案是有效的。我想了解爲什麼基本的PHP嘗試捕獲不在這裏工作,我們做錯了什麼? – madz

回答

1

我認爲最好的方法是防止發生異常而不是隱藏它。所以之前做一個新的類的實例,檢查是否存在其:

private function getForeignModelInstance() 
{ 
    try { 
     if (!$this->foreignModel) { 
      $model = $this->getFullForeignModel(); 

      if ($model && class_exists($model)) { 
       $this->foreignModel = new $model(); 
      } 

      return null; 
     } 

     return $this->foreignModel; 
    } catch (\Exception $e) { 
     return null; 
    } 
} 

注:class_exists不會使用短,別名類名稱的工作。

+0

這是一個工作。這是否意味着Laravel不遵守PHP所擁有的try..catch邏輯? –