2017-05-07 77 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逻辑? –