良好的通用尝试/捕获程序

时间:2010-02-22 20:25:30

标签: coldfusion cfquery

使用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:如果这是本次会议的第一次错误,我可能想给某人发电子邮件。

2 个答案:

答案 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