PDO:是否有必要尝试捕获


PDO: is try-catch necessary or not?

我得到的信号很混合。PDO文档中的警告似乎很清楚,省略try-catch可能会危及安全性。但是,此线程表明它实际上没有必要。在我看来,将每个查询包装在 try-catch 中会很烦人。关于如何处理这个问题的任何建议?

存在安全风险,但您不需要在任何地方添加 try/catch。风险在于,如果未捕获异常,则可能会向用户显示来自异常的错误消息(可能包含敏感信息)。

但如文档所述,您可以改为添加异常处理程序。通过重定向到一般错误消息,可以避免向用户显示错误消息中的敏感信息。

在任何情况下,设置通用错误处理程序似乎是一件非常明智的事情。您不希望向用户显示神秘的错误消息。即使您确实采用了"尝试/捕获所有内容"方法,也很难 100% 确定已捕获可能发生的所有可能的异常,因此异常处理程序仍应用作回退。

PDO有三种可配置的错误模式。默认设置只是设置错误代码,而不是引发异常。

但是,您应该使用 PDO::ERRMODE_EXCEPTION . PHP和PDO通常处理错误的方式(即,默默地按下代码并在不告诉你的情况下做错误的事情)绝对是疯狂的,也是PHP可怕的一个重要原因。

如果您的查询出现问题,正确的做法是停止执行并引发异常,以便您有一个清晰的回溯并可以找到并解决问题。

此外,使用 try-catch 比在每次查询后检查errorCodeerrorInfo要容易得多(即不那么"烦人")。只有当你预料到错误的可能性并且可以对此做一些事情时,你才应该使用 try-catch——否则你应该让异常冒出来。 如果这是一个意外的错误,它可能来自代码中的错误,您应该通过异常了解它,以便您可以修复它!

如果你想做一些特别的事情来报告异常(例如,漂亮地打印它,给你发一封电子邮件,等等),那么注册一个默认的异常处理程序来处理任何未捕获的异常。在生产系统上,应注册一个默认异常处理程序,该处理程序显示通用 500 页,并且错误详细信息很少,并在其他位置记录完整的回溯以进行调试。

如果可能发生错误,那么它最终会发生。您需要处理 PDO 查询可能生成的任何潜在错误,无论您在哪个环境中运行。假设(就像您发布的线程中的人员所做的那样),由于这是一个生产系统,请尝试..没有必要抓住是愚蠢的,恕我直言。错误不仅会在调试代码时引发,还可能发生在生产系统上。就个人而言,我喜欢围绕我在日志中看到的错误提供上下文,所以我确实使用 try..抓住我的疑问。

这也与您最终向用户呈现的错误无关。我发现在这种情况下,使用安全一词会使事情变得模糊。您的系统永远不应向用户显示神秘的错误消息(可能包括敏感数据),无论您如何处理错误(这不是特定于 PDO)。

有几种方法可以解决此问题:

  1. 创建一个函数,通过传递一个已绑定所有内容的预准备语句来为您执行 PDO 查询。
  2. 创建一个全局异常处理程序并在那里捕获任何异常(我不喜欢这种方法,因为您最终会丢失上下文......如果这被某个全局处理程序捕获,我应该向用户显示什么错误?如果这样的错误是在某个全球背景下捕获的,您如何回溯?
  3. 初始化 PDO 以免引发异常并进行手动错误检查,如果这是您的毒药。就个人而言,我发现异常与基于 OOP 的系统配合得更好,但每个人都有自己的。

我的 2c。