使用Adobe ColdFusion 8及更低版本,我的所有cfqueries都包含在try catch中,该catch调用database.cfc中名为“CatchError”的函数。
<cftry>
<cfquery datasource="myDatasource">
UPDATE TableName SET
...
WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.ID#">
</cfquery>
<cfcatch>
<cfset local.result = Variables.objDatabase.CatchError(cfcatch)>
</cfcatch>
</cftry>
Q1:是否有一个好的通用错误捕获器,它已经编写了考虑所有不同的异常类型(Any,Application,Database,Expression,Lock,MissingInclude,Object,Security,Template和SearchEngine)?
Q2:我想我也想记录这些错误,也许不是文本文件而是数据库。当然,您在数据库中看到了...记录数据库错误的问题......
问题3:如果这是本次会议的第一次错误,我可能想给某人发电子邮件。
答案 0 :(得分:2)
我认为您的问题一般适用于错误处理,因此您可能会在与语言无关的问题中找到一些有用的答案。
1。 Soldarnal回答了问题1,我倾向于同意 - 尝试捕获可能发生错误的每个位置(例如数据库交互),并且更好地拥有捕获所有错误并使用try / catches的全局错误处理程序,这是很多工作。发生错误的可能性高的地方,并且您希望继续执行(通常,如果您的站点无法访问您的数据库,则会有点卡住)。
2。关于日志记录,cflog
是最强大的,因为除非您的服务器出现严重问题,否则几乎总能记录到文件。接下来是cfmail
- 服务器应排队它无法发送的邮件,尽管还有更多错误。接下来是cfhttp
您可以将错误记录到外部站点,但是在发送错误时它将需要启动,否则您将丢失它。最后,你可以登录到一个数据库,但如果你的卡住了就会再次登录。
您可以使用组合,例如将错误记录到数据库,除非数据库不可用,然后登录到文件并在备份时将错误重新插入数据库。
3。如果您正在跟踪错误,例如在数据库中或通过外部服务,您应该能够将其配置为在第一个错误时向您发送电子邮件,或者cfmail
将允许您发送有关所有错误的邮件。我们使用自定义构建的错误处理脚本,但网络上可能会有一些浮动。
答案 1 :(得分:1)
在application.cfc中,在OnRequestStart函数中,您可以添加以下行:
<cferror type="EXCEPTION" exception="any" template="act-error.cfm">
通常在act-error.cfm上,您希望显示用户html,表明他们遇到了未处理的异常(用更友好的语言)以及一些友好链接。此外,在act-error上,您仍然可以访问所有变量,包括错误变量以执行您想要的操作(日志,电子邮件,更新会话变量等...)。
显然,正如您所述,如果原始错误是数据库已关闭,则记录到数据库将失败。但是,如果你不知道,ColdFusion管理员中有异常日志,你可以启用它来记录这样的问题。
编辑 - 这是使用cferror方法的通用处理程序: http://www.bennadel.com/blog/932-Ask-Ben-Handling-Errors-With-ColdFusion-CFError.htm