【问题标题】:try catch in php pdo, doing it right way尝试在 php pdo 中捕获,以正确的方式进行
【发布时间】:2018-05-16 08:12:54
【问题描述】:

我正在使用带有 postgres 的 php pdo。我正在使用核心 php,没有 mvc,没有类和对象。由于我是开发新手,所以我心中有些疑问:-

  • 我是否应该在每次查询执行时使用 try catch。
  • 如果我使用 try catch 那么我是否应该在异常时退出正在运行的脚本

  • 有没有办法为所有查询使用一个 try catch,我的意思是为执行查询创建一个通用函数。

  • 以及如何处理 ajax 上的异​​常。

请有人澄清我对此的怀疑。

【问题讨论】:

    标签: php exception pdo


    【解决方案1】:

    问题太多,而且太笼统。但在大多数情况下:

    1. 没办法
    2. 这取决于您,您的应用程序的逻辑和特定情况。说如果城市某处漏水,是否需要完全停止供水系统?通常,一旦数据库查询失败,具体的模块/部分就没有意义进行进一步处理。只有那个模块/部分应该退出/停止。
    3. 最好不要自己包装 PDO。在大多数情况下,您只会让代码更难维护而没有任何实际好处。
    4. 通常最好的解决方案是返回一些 HTTP 错误(404 Not Found 或 500 Internal Server Error),让客户端代码知道“抱歉,您还无法获取此信息”;客户端代码将如何处理此类错误 - 这取决于您的客户端代码的逻辑/流程

    【讨论】:

    • 好的,因为我在生产服务器上,错误报告已关闭。我应该使用 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);.
    • 我不熟悉特定于 PDO 的标志。一般来说,对于生产来说,每一个错误/异常都应该写入日志(并且不应该向浏览器显示)。所以,是的,error_reporting 已关闭,log_errors 已打开,并且 PDO 需要记录错误的所有内容也已打开。
    • 我明白你的意思;使用 try..catch 但不是每个查询绝对有意义;不幸的是,我看不到如何区分连接到数据库时发生的授权错误并说验证错误,所以创建一个包装器来记录每个异常可能是有意义的(但我希望应该有一些更优雅的方式)
    • @KuldeepThakur 围绕整个代码进行全局尝试捕获是完全可以的。或者您可以创建一个本质上相同的异常处理程序。示例代码参考我的文章Error reporting in PHP
    • @YourCommonSense 我可以部分不同意吗?我认为更典型的案例是“有些东西坏了,但我们仍在前进”。假设news 表损坏/锁定/等,但我们仍然能够使用传入的电子邮件消息呈现页面的其余部分。但是要在最顶层处理 db 异常,我们应该允许它传播并在其途中停止一切。
    【解决方案2】:
    1. 仅当您有特定场景来处理特定错误时。例如,一个重复的唯一键,您有一个备用方案。 (请注意,您应始终检查此特定错误,否则重新抛出异常)。
      但是对于常规查询,只能处理任意错误 - 就像@skyboyer 所说的那样 - 没办法。异常应该冒泡到站点范围的处理程序。
    2. 同样,这取决于。如果是特殊处理场景,请为该场景做任何你想做的事情。但对于任意错误,同意暂停代码执行,因为您的代码可能会产生不可预知的结果。
    3. 这是两个问题合二为一。
      • 拥有一个全局 try catch 是完全可以的,它将充当站点范围的异常处理程序,包装整个代码。
      • 作为运行所有查询的函数 - 这本身就是一个绝妙的主意,但它与错误处理无关。仅仅因为数据库错误与您站点上的任何其他错误没有什么不同,因此应该以完全相同的方式处理。因此,为查询函数编写专用的 try-catch 是没有意义的。让它抛出一个异常,然后像处理您网站上的任何其他错误一样处理该异常。
    4. 与非 AJAX 错误的方式几乎相同。再次 - 就像@skyboyer 所说 - 让您的处理程序返回 500 HTTP 状态,然后您的 AJAX 调用代码将知道有错误。够了

    我写了一篇文章,试图解释所有这些问题,PHP Error reporting 你可能会觉得有趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2019-06-29
      • 1970-01-01
      相关资源
      最近更新 更多