ColdFusion没有捕获NoClassDefFoundError

Abb*_*don 6 java coldfusion coldfusion-8

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

但这不起作用.你能告诉我怎么做吗?我需要在特定的地方捕获此错误,而不是OnError我的Application.cfc 的功能.

Lei*_*igh 9

现在我已经喝了更多的咖啡,我不认为cfcatch能够捕捉到咖啡NoClassDefFoundError.根据文档,它只处理异常:

例外是破坏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...");
        }
    }
Run Code Online (Sandbox Code Playgroud)

更新

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>
Run Code Online (Sandbox Code Playgroud)