Coldfusion 良好的通用试捕程序

Coldfusion 良好的通用试捕程序,coldfusion,cfquery,Coldfusion,Cfquery,使用Adobe ColdFusion版本8及以下版本,我的所有CFQuery都封装在一个try-catch中,该函数调用database.cfc中名为“CatchError”的函数 更新表名集 ... 其中ID= 问题1:是否有一个很好的通用错误捕获程序,它考虑了所有不同的异常类型(任何、应用程序、数据库、表达式、锁、丢失、包含、对象、安全性、模板和搜索引擎) 问题2:我想我也想记录这些错误,可能不是记录到文本文件,而是记录到数据库。当然,您看到了这个问题…在数据库中记录数据库错误 问题3:

使用Adobe ColdFusion版本8及以下版本,我的所有CFQuery都封装在一个try-catch中,该函数调用database.cfc中名为“CatchError”的函数


更新表名集
...
其中ID=
问题1:是否有一个很好的通用错误捕获程序,它考虑了所有不同的异常类型(任何、应用程序、数据库、表达式、锁、丢失、包含、对象、安全性、模板和搜索引擎)

问题2:我想我也想记录这些错误,可能不是记录到文本文件,而是记录到数据库。当然,您看到了这个问题…在数据库中记录数据库错误


问题3:如果这是此会话的第一个错误,我可能想给某人发电子邮件。

在您的应用程序中。cfc在OnRequestStart函数中,您可以添加以下行:

<cferror type="EXCEPTION" exception="any" template="act-error.cfm">

通常在act-error.cfm上,您希望向用户显示html,表明他们遇到了未处理的异常(使用更友好的语言)以及一些友好的链接。此外,在act错误时,您仍然可以访问所有变量,包括执行所需操作的错误变量(日志、电子邮件、更新会话变量等)

显然,正如您所说,如果最初的错误是数据库关闭,那么登录到数据库将失败。但是,如果您不知道,ColdFusion管理中有异常日志,您可以启用它来记录类似的问题

编辑-以下是使用cferror方法的常规处理程序:
我认为您的问题一般适用于错误处理,因此您可能会在语言不可知问题中找到一些有用的答案

一,。Soldarnal已经回答了问题1,我倾向于同意这一点——要想抓住每个可能发生错误的位置,比如数据库交互,需要做大量的工作,最好有一个全局错误处理程序来捕获所有错误,并在发生错误的可能性很高且希望继续执行的地方使用try/catch(通常,如果您的站点无法访问您的数据库,则会有点卡住)

二,。关于日志记录,
cflog
是最健壮的,因为除非服务器出现严重问题,否则您几乎可以始终登录到文件
cfmail
是下一步-服务器应该将无法发送的邮件排队,尽管还有更多的邮件会出错。下一步是
cfhttp
,您可以将错误记录到外部站点,但在发送错误时需要将其启动,否则您将丢失错误。最后,您可以登录到数据库,但如果这是您的日志,那么再次登录

您可以使用组合,例如,将错误记录到数据库,除非数据库不可用,然后记录到文件,并在数据库备份时将错误重新插入数据库


三,。如果您正在跟踪错误,例如在数据库中或通过外部服务跟踪错误,您应该能够将其配置为在第一个错误时向您发送电子邮件,或者
cfmail
将允许您发送关于所有错误的邮件。我们使用一个定制的错误处理脚本,但是可能会有一些浮动在web上。

如果您使用的是application.cfc,那么应该使用onError(),而不是cferror。否则,这就像用螺丝刀敲打钉子一样——这可能会奏效,但你使用的工具不正确。我很好奇为什么OnError更好?我不喜欢使用它,因为我不喜欢在我的application.cfc中有html输出。它本身并不“更好”,但它是与application.cfc框架相关联的错误处理机制。认为这是奥卡姆剃刀上的练习-最简单的解释通常是最好的。如果你听到蹄声,你会想到“马”,而不是“斑马”。如果其他开发人员看到application.cfc,他们会认为是“onError”,而不是“cferror”。onError方法还具有真正无处不在的优势;cferror调用之前发生的错误将被取消处理。顺便说一句,如果您愿意,您也可以从OneError处理程序的主体中轻松地使用cfinclude。
<cferror type="EXCEPTION" exception="any" template="act-error.cfm">