我正在使用ColdFusion 8.我想在ColdFusion中捕获NoClassDefFoundError
异常但是我不能...它仍然失败并将错误记录在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>
但这不起作用。你能告诉我怎么做吗?我需要在特定的地方捕获此错误,而不是我的Application.cfc的OnError
函数。
答案 0 :(得分:9)
现在我喝了更多咖啡,我认为cfcatch无法捕捉到NoClassDefFoundError
。根据文档,它只处理Exceptions:
异常是破坏正常指令流的事件 在ColdFusion页面中,例如数据库操作失败,丢失 包含文件和开发人员指定的事件。
NoClassDefFoundError
是Error。
错误表示合理应用的严重问题 不应该试图抓住
听起来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>