如何在ColdFusion中捕获整个应用程序的错误?

时间:2012-09-18 20:18:31

标签: coldfusion railo cfml application.cfc

我目前正在尝试通过在Application.cfc中包含以下代码来捕获应用程序中的所有错误:

<cffunction name="onError">
    <!--- The onError method gets two arguments: 
            An exception structure, which is identical to a cfcatch variable. 
            The name of the Application.cfc method, if any, in which the error 
            happened. --->
    <cfargument name="Except" required=true/>
    <cfargument type="String" name = "EventName" required=true/>
    <!--- Log all errors in an application-specific log file. --->
    <cflog file="#THIS.NAME#" type="error" text="Event Name: #Eventname#" >
    <cflog file="#THIS.NAME#" type="error" text="Message: #Except.message#">
    <!--- Throw validation errors to ColdFusion for handling. --->
    <cfif Find("coldfusion.filter.FormValidationException", Arguments.Except.StackTrace)>
        <cfthrow object="#Except#">
        <cfelse>
        <cfoutput>
        <h1>#Eventname#</h1>
        </cfoutput>
        <cfdump var="#Except#">
    </cfif>
</cffunction>

其中一些借鉴了我见过的其他例子(我不完全理解)。我最终希望显示某种优雅的错误页面,以征求用户的反馈,然后记录/通过电子邮件发送错误。这似乎抓住了很多错误,但并非全部。如果我不需要,我不想在任何地方使用try / catch。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您还可以在ColdFusion管理员中定义整体ColdFusion错误处理程序。在服务器设置&gt;下设置,向下滚动到底部并设置“站点范围错误处理程序”选项。

在文档About error handling in ColdFusion

中查看此内容

答案 1 :(得分:0)

Application.cfc中的“OnError”方法只会捕获先前未被用户定义的try / catch语句捕获的错误。

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=appFramework_13.html

有了这个说法,我认为在必要时在代码中尝试catch语句是个好主意(在这种情况下你不能优雅地降级)。我喜欢做的是实例化一个包装所有异常处理的cfc。然后,这个cfc可以包含实际的错误处理逻辑,而OnError方法需要做的就是实例化正确的组件并“控制”错误。

一个非常简单的例子:

<cfscript>

  /** Application.cfc **/
  public function onError(required exception, required string eventName)
  {
    var factory = new App.ExceptionFactory();
    var e = factory.getNewException(arguments.eventName, arguments.exception);

    if (e.logError()) {
      /** we cauld also have a logging cfc etc **/
      var loggingFile = new App.SomeLoggingCfc(arguments.eventName, arguments.exception);
      loggingFile.commitLog();
    }
    if (e.debugError()) {
      // show developer info here
    }

    /** Throw the exception **/
    e.throwException();
  } 

  /** App.ExceptionFactory **/
  public ExceptionFactory function getNewException(required string eventName, required exception)
  {
    return new "App.#exception.type#"(argumentCollection = arguments);
  } 

  /** App.Exception.CustomException **/
  public boolean function logError()
  {
    /** log the error **/
  }
  public boolean function debugError() {}

  public function throwException()
  {
    /** do what you want here **/
  }

</cfscript>