【问题标题】:PDO "exception safety" and writing it to a log file PHPPDO“异常安全”并将其写入日志文件 PHP
【发布时间】:2012-09-23 17:29:02
【问题描述】:

我正在编写一个 PDO 包装器,但在捕获异常时遇到了这个问题。

我正在尝试维护异常安全的做法,所以我想知道如何捕获异常,将其写入日志文件,并使用异常安全来做某事,可能会告诉用户重试操作或导航到错误页面或其他任何内容(您可以提出的任何建议)。

如果可能的话怎么做呢?

【问题讨论】:

  • 你的代码有什么问题?
  • 我什至没有代码,我很难编写 ADD、DELETE、UPDATE 方法,捕捉错误并执行上述操作,这就是为什么我需要你的帮助,我的包装器现在只包含构造函数。
  • 您知道 PDO 包装器,对吧?你正在包装一个包装器。

标签: php exception pdo


【解决方案1】:

看看这段代码sn-p,它显示了它是如何完成的:

class MyDb extends PDO 
{
  protected $error;

  function __construct( $logger )
  {
    try {
      parent::__construct( 'mysql:host=localhost;dbname=xxxx', 'xxx', 'xxx' );
      $this->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

    }
    catch ( Exception $e ) {
       $this->error = $e->getMessage();
       // do your log writing stuff here
       $logger->Add( $this->error ); 
    }
  }
}

更新:

类的用法:

$logger = new MyLogger();
$db = new MyDb( $logger );

当然,您需要一个带有 add 方法的记录器类:

class MyLogger
{
  const FILENAME = '/tmp/mylog.txt' ;

  function Add( $error )
  {
    file_put_contents( self::FILENAME, $error, FILE_APPEND);
  }
}

【讨论】:

  • 这只会得到错误消息,如何防止脚本崩溃,以正确的方式对用户做出反应,并将其写入日志错误文件?
  • 示例不会分解。让一个类处理单个任务(关注点分离)是一个很好的设计。我更新了这个例子。
  • @JvdBerg:允许方法抛出异常并在调用时(而不是在方法本身内部)捕获它们也是一种好习惯。这样,您可以更灵活地处理在引发异常的特定上下文中的处理方式。 (如果用户请求了输出,输出一条消息,如果是内部使用,就记录等)。
  • 另外(这更像是一种约定),常量名应该大写,方法/函数/变量名应该是驼峰式,类/对象名应该是 PascalCased,仅供参考:)
  • @MadaraUchiha:我知道.. 我知道.. :) 这只是一个让他开始使用 OOP 的简单示例。我不想用 40 行代码解释一个体面的 OOP 设计。
猜你喜欢
  • 2014-12-13
  • 2018-09-04
  • 2022-11-14
  • 2018-04-16
  • 1970-01-01
  • 2010-12-21
  • 2012-08-01
  • 2014-12-24
  • 2014-07-27
相关资源
最近更新 更多