尝试用php pdo中的catch,以正确的方式进行

尝试用php pdo中的catch,以正确的方式进行,php,exception,pdo,Php,Exception,Pdo,我在postgres中使用php pdo。我使用的是核心php,没有mvc,没有类和对象。我对发展还不熟悉,所以心里有些疑惑:- 我应该在每次执行查询时使用try-catch吗。 如果我使用try-catch,那么我是否应该在异常时退出正在运行的脚本 有没有一种方法可以对所有查询使用一个try-catch,我的意思是创建一个用于执行查询的公共函数。 以及如何在ajax上处理异常。 请有人澄清我对此的疑虑 问题太多,太笼统了。但在大多数情况下: 不可能 这取决于你,你的应用程序的逻辑和具体情况

我在postgres中使用php pdo。我使用的是核心php,没有mvc,没有类和对象。我对发展还不熟悉,所以心里有些疑惑:-

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

  • 有没有一种方法可以对所有查询使用一个try-catch,我的意思是创建一个用于执行查询的公共函数。

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

请有人澄清我对此的疑虑

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

  • 不可能
  • 这取决于你,你的应用程序的逻辑和具体情况。比如说,如果城市某个地方发生漏水,是否会完全停止供水系统?通常,有一些具体的模块/部件,一旦DB查询失败,就无法进一步处理。只有该模块/部件应退出/停止
  • 最好不要自己包装PDO。在大多数情况下,您只会使代码更难维护,而没有任何实际好处
  • 通常,最好的解决方案是返回一些HTTP错误(404找不到或500内部服务器错误),让客户端代码知道“对不起,您还不能获取此信息”;客户端代码将如何处理此类错误-这取决于客户端代码的逻辑/流程
  • 只有当您有特定的场景来处理特定的错误时。例如,一个重复的唯一键,您有一个回退方案。(请注意,应始终检查此特定错误,否则应重新引发异常)。
    但是对于一个常规的查询,仅仅处理一个任意的错误——就像@skyboyer所说的那样——是不可能的。异常应该由站点范围的处理程序处理
  • 再说一次,这要视情况而定。如果是一个特殊的处理场景,请按照您的想法执行该场景。但是对于任意错误,我们同意停止代码执行,因为您的代码可能会产生不可预测的结果
  • 这是一个两个问题。
    • 有一个全局try-catch可以充当站点范围的异常处理程序,包装整个代码
    • 至于运行所有查询的函数,这本身就是一个绝妙的想法,但它与错误处理无关。这仅仅是因为数据库错误与站点上的任何其他错误没有区别,因此应以完全相同的方式处理。因此,为查询函数编写专用的try-catch是没有意义的。让它抛出一个异常,然后将该异常作为站点上的任何其他错误处理
  • 与非AJAX错误的方式几乎相同。同样,正如@skyboyer所说,让处理程序返回500 HTTP状态,然后AJAX调用代码就会知道有错误。够了

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

    好的,因为我在生产服务器上,所以错误报告已关闭。我应该使用$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);。我不熟悉PDO特定的标志。一般来说,对于生产,每个错误/异常都应该写入日志(并且不应该向浏览器显示任何错误/异常)。所以,是的,错误报告是关闭的,日志错误是打开的,PDO需要记录错误的所有东西也是打开的;使用try..catch绝对有意义,但不是每个查询;不幸的是,我不知道如何区分连接到DB时发生的授权错误和验证错误,因此创建一个包装器来记录每个异常可能是有意义的(但我希望应该有更优雅的方式)@KuldeepThakur对整个代码进行全局尝试捕获是完全可以的。或者您可以创建一个基本相同的异常处理程序。有关示例代码,请参阅我的文章@YourCommonSense,我可以部分不同意吗?我相信更典型的例子是“有些东西坏了,但我们仍在前进”。假设
    news
    表已损坏/锁定/etc,但我们仍然可以使用传入的电子邮件呈现页面的其余部分。但要在最顶层处理db异常,我们应该允许它传播,并在传播过程中停止一切。