PHP web应用程序何时使用try/catch

PHP web应用程序何时使用try/catch,php,codeigniter,try-catch,Php,Codeigniter,Try Catch,我正在使用PHP和CodeIgniter框架。我读过一些文章,说使用try/catch方法是不好的做法 我理解在可能发生潜在错误时使用开发日志,让实际错误发生,然后使用log\u message('level','message') 但在部署时,您希望抑制并处理出现的任何错误。我是否应该使用try/catch块,例如在 try { $this->data['important'] = $this->Test_Model->do_something($data);

我正在使用PHP和CodeIgniter框架。我读过一些文章,说使用try/catch方法是不好的做法

我理解在可能发生潜在错误时使用开发日志,让实际错误发生,然后使用
log\u message('level','message')

但在部署时,您希望抑制并处理出现的任何错误。我是否应该使用try/catch块,例如在

try { 
    $this->data['important'] = $this->Test_Model->do_something($data);
    if(empty(data['important'])) {
    throw new Exception('no data returned');
}

catch (Exception $e) {
    //alert the user then kill the process
    var_dump($e->getMessage());
}

当我正确使用try/catch时,我感到困惑。

您的代码中有一个语法错误,应该是:

try { 
  $this->data['important'] = $this->Test_Model->do_something($data);
  if(empty($this->data['important'])) {
    throw new Exception('no data returned');
  }
} catch (Exception $e) {
  //alert the user.
  var_dump($e->getMessage());
}
使用
try/catch
不是一个坏习惯

异常是可捕获的,无需重写PHP默认错误处理程序。这意味着您可以在运行时发生异常时执行某些操作


日志是给你的。如果您的应用程序不正常,并且您记录了可能的问题点,那么您可以更容易地识别错误。您的日志和本机日志之间的主要区别在于上下文,本机日志没有上下文,它们只有事件和可能的堆栈跟踪。

只有在两种情况下才能捕获异常:

  • 当异常本身不需要立即停止程序的执行时,即:catch块智能地处理异常,并允许程序以正常的方式跟随块执行
  • 当您想要执行额外的错误处理并干净地关闭时,和/或记录/显示错误信息。(可选)然后可以重新抛出异常,使异常在堆栈中“冒泡”,以便其他例程也可以这样做。例如:

    try {
      //code
    } catch( Exception $e ) {
      echo "friendly error message";
      logging_function($e->getMessage());
      throw $e;
    }
    
  • 最被广泛滥用的方法是简单地使用try/catch块以静默方式忽略异常并继续执行,就好像一切正常一样。如果在程序执行的很晚的时候出现了错误,那么做类似的事情会回来咬你的屁股,而这个被忽略的异常会警告你,然后你会花费数小时的时间来跟踪:

    try {
      // code
    } catch( Exception $e ) { /* L7: Exception handling is for squares! */ }
    

    在这些情况下,最好让异常在发生的地方引发错误,而不是忽略该错误导致更严重的错误。

    在许多情况下,您不想抑制异常。这是Eric Lippert的一个非常有趣的异常分类。在处理异常时在同一代码块中抛出异常是一种不好的做法。不过,异常对于分离组件非常有用<代码>FormBuilder引发异常,
    操作
    处理异常
    EmailValidation
    引发异常,
    UserModel
    处理该异常。等等#IMHOAlso,当您的方法不知道如何处理问题时,异常非常有用,但调用您的方法的某些异常可能会非常有用。例如,如果您无法从API获取某些数据,则可以引发异常并让调用方法决定要执行的操作(例如,失败或进行另一次调用)。更多细节here@Rudie你能推荐一个php气泡异常处理程序的好例子/教程吗?