【发布时间】:2012-03-19 06:47:58
【问题描述】:
我正在为我正在进行的项目挖一个坑。我有这个庞大的项目(成千上万行),到处都是 MySQL 错误。我现在正在清理它们。
我有一个所有查询都经过的数据库类,所以我所做的是每当出现 SQL 错误时,我现在就抛出一个异常。问题是我不能停止执行。它必须像往常一样继续,只记录异常,以便我可以跟踪它们并一次修复它们。
我希望set_exception_handler 能做我想做的事,但文档明确表示它会在调用我的处理程序后停止执行。那么我该如何解决呢?
异常可以停止当前函数,但我希望它退出函数,可能返回 null 或 false,然后正常继续,但我需要它来调用我的全局异常处理程序。
澄清一下:
我想从我的数据库类中抛出一个异常(只要出现 SQL 错误)。然后我想记录这个错误和/或在屏幕上显示一条消息,直到我可以修复 SQL 错误,或者将有问题的行包装在 try/catch 中。我不希望它停止执行。如果我只是调用一些error_handler() 函数而不是抛出异常,那么我无法捕获它。如果我立即捕获它(也在 DB 类中),那么我就无法在堆栈的更深处捕获它(除非我重新抛出它,但随后我们又回到了暂停执行状态)。
【问题讨论】:
-
如果您已经更新了将 MySQL 错误转换为异常的代码,为什么不直接记录错误而不是抛出异常?
-
@pgraham:该死……这是个好问题。原因是如果我不想让它落到全局异常处理程序中,我希望能够捕获异常。另外,我想要一个集中的异常处理和日志记录功能。最后,一旦我清除了错误,我想稍微修改全局异常处理程序,以便它实际上确实死并抛出一个致命错误。
-
@downvoter:想解释一下为什么这是一个糟糕的问题?
-
@alfasin: 1) 我删除了我的帖子,因为在 pgraham 提出上述问题后我意识到它没有意义,2) 这个问题本身并不是为了启发任何人,这就是为什么它是题。如果您认为这是一个坏主意,请将原因作为答案发布,以便它可以帮助他们。对错误信念的问题投反对票可能会阻止其他与我有同样错误想法的人学习。 3)我有调试打印。我想要异常,以便它们可以被捕获(如上面的评论中所述)。
-
简短的回答是否定的。如果您不能将所有代码包装在 try/catch 块中,那么任何到达顶级异常处理程序的东西都会死掉。我的建议是定义一个可以向其传递异常的日志记录函数。然后,当您将 MySQL 错误转换为异常时,不要抛出异常,而是将其传递给日志记录函数。稍后当您确实需要致命错误时,您只需要更新日志功能以也抛出异常。
标签: php mysql exception exception-handling