2

我目前正在尝试通过在 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。有什么建议么?

4

3 回答 3

1

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

在文档中也检查一下关于 ColdFusion 中的错误处理

于 2012-09-18T20:28:50.270 回答
0

使用共享主机不应该是一个问题,只需询问您的 hosr 错误模板是什么,如果他们对 cf 有所了解,那么他们将进行设置。Wr 使用 error.cfm 和 404.cfm fot 示例,它们位于每个客户站点的根目录中。

于 2012-09-18T22:00:45.023 回答
0

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

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

话虽如此,我认为在必要时在代码中包含 try 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>
于 2012-09-18T23:31:31.207 回答