6

我正在使用 ColdFusion 8。我想NoClassDefFoundError在 ColdFusion 中捕获异常,但是我不能……它仍然失败并在 exception.log 文件中记录错误。这是我尝试过的。

<cftry>
    <cfset myJavaObject.myMethod()>
    <cfcatch type="any">
        <cfdump var="#cfcatch #">
    </cfcatch>
    <cfcatch type="java.lang.Throwable">
        Horrible exception.
        <cfdump var="#cfcatch #">
    </cfcatch>
</cftry>

但这不起作用。你能告诉我怎么做吗?我需要在特定位置而不是在OnErrorApplication.cfc 的函数中捕获此错误。

4

1 回答 1

9

现在我喝了更多的咖啡,我认为cfcatch无法捕捉到NoClassDefFoundError. 根据文档,它只处理Exceptions

异常是破坏 ColdFusion 页面中正常指令流的事件,例如数据库操作失败、缺少包含文件和开发人员指定的事件。

NoClassDefFoundError是一个错误

错误表示合理的应用程序不应尝试捕获的严重问题

听起来好像cfcatch只是为了处理正常的“可恢复”问题而设计的。一旦你获得了NoClassDefFoundError. 这是一个严重的错误,你无法克服它(在正常情况下)。您最多只能显示错误消息并退出。

Application.onError似乎可以处理未捕获的错误,例如NoClassDefFoundError,以及异常。所以我认为你能做的最好的就是实施onError并让它显示一个错误页面。

    <!---- test code --->
    <cfset myJavaObject = createObject("java", "path.to.MyClass") />
    <cfset myJavaObject.myMethod() />

    <!---- Application.cfc --->
    <cfcomponent>
         .... settings ...
         <cffunction name="onError" returnType="void"> 
             <cfargument name="Exception" required="true" /> 
             <cfargument name="EventName" type="string" required="true" /> 
             <h1>onError Test</h1>
             <cfdump var="#Exception#" />
         </cffunction>
    </cfcomponent>

    // test class
    public class MyClass {
        public void myMethod() {
            throw new NoClassDefFoundError ("Testing...");
        }
    }

更新

Any 类型包括 Java 对象类型 java.lang.Exception 的所有错误。它不包括 java.lang.Throwable 错误。要捕获 Throwable 错误,请在 cfcatch 标记类型属性中指定 java.lang.Throwable

尽管文档说了什么,Throwable但在我的任何测试(或您的测试)中捕获都不起作用。这强烈表明行为或文档中存在错误。无论哪种方式,它都不像宣传的那样工作,因此如上所述,我知道的唯一替代方法是使用通用错误处理程序。如果您出于某种原因必须坚持使用 Application.cfm 文件,请尝试使用<cferror type="exception" ...>

(荒谬)测试用例:

<cftry>
   <cfset myJavaObject = createObject("java", "path.to.MyClass")>
   <cfset myJavaObject.myMethod()>
   <cfcatch type="java.lang.NoClassDefFoundError">
      CAUGHT java.lang.NoClassDefFoundError
   </cfcatch>
   <cfcatch type="java.lang.LinkageError">
      CAUGHT java.lang.LinkageError
   </cfcatch>
   <cfcatch type="java.lang.Error">
      CAUGHT java.lang.Error
   </cfcatch>
   <cfcatch type="java.lang.Throwable">
      CAUGHT java.lang.Throwable 
   </cfcatch>
   <cfcatch type="any">
      CAUGHT ANY
   </cfcatch>
   <cfcatch>
      CAUGHT
   </cfcatch>
</cftry>
于 2013-01-09T18:01:29.873 回答