【问题标题】:php catch simple exception and pdo exceptions both in catchphp在catch中捕获简单异常和pdo异常
【发布时间】:2019-02-15 21:00:45
【问题描述】:
try {
    $sql = "UPDATE table bla bla bla";
    $bind_param_arr = array();
    $stmt = $conn_p->prepare($sql);
    $stmt->execute($bind_param_arr);
    createLog(200);
    echo (json_encode(array('status' => 200, 'data' => 'Updated Successfully'));
} catch (PDOException $e) {
    createLog(500);
    echo (json_encode(array('status' => 500, 'data' => 'There is some error'));
}


function createLog($status)
{
    $log_file = "log.txt";

    $openfile = fopen($log_file, "a");
    if ( ! $openfile) {
        throw new Exception("unable to create log file");
    }
    $datetime = date("Y-m-d H:i:s a");
    fwrite($openfile, $datetime);
    fwrite($openfile, 'Bla bla bla');

    fwrite($openfile, "\n");
    fclose($openfile);
}

它没有捕获简单的异常,因为我在 catch 块中使用了 PDOException 类的实例。我可以使用异常类的实例而不是 PDOException (然后它的工作)。 什么是正确的方法?

【问题讨论】:

  • 添加另一个} catch (Exception $e) { ?
  • 您可以拥有多个 catch 块。但是您可能不应该使用Exception,因为这太笼统了。相反,定义您自己的扩展 Exception 并抛出(并捕获......)它。

标签: php exception pdo


【解决方案1】:

如果您只想捕获 PDOException 并以某种方式处理它,最好使用 PDOException

样本

catch(PDOException $e) {
    handler1($e);
} catch(Exception $e){
    handler2($e);
} 

如果你捕获的异常对你来说并不重要,并且你平等地处理不同类型的异常,那么使用 Exception

} catch(Exception $e){
    handler($e);
} 

更新

为了不处理异常,你可以将处理程序留空,你应该确保它不会影响任何东西

示例:

} catch(Exception $e){ 
}

【讨论】:

  • 我还有一个问题?假设在我上面的示例代码中,如果更新成功但在创建日志文件时出错,那我该怎么办。我应该使用 pdo 的提交和回滚功能回滚事务吗?
  • @KuldeepThakur 取决于你的应用程序,如果异常不影响任何事情,你可以不处理它
【解决方案2】:

使用通用的Exception类捕捉异常,然后分类:

try{
//something
}
catch(Exception $e)
{
        if($e instanceof PDOException){
              // handle PDOException
         }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2011-01-11
    • 2014-03-22
    • 2020-02-28
    • 2015-06-21
    相关资源
    最近更新 更多