Now that I have had more coffee, I do not think cfcatch is capable of catching a NoClassDefFoundError
. According to the documentation, it only processes Exceptions:
Exceptions are events that disrupt the normal flow of instructions
in a ColdFusion page, such as failed database operations, missing
include files, and developer-specified events.
NoClassDefFoundError
is an Error.
An Error indicates serious problems that a reasonable application
should not try to catch
It sounds like cfcatch
was only designed to handle normal "recoverable" problems. There is really not much you can do once you get a NoClassDefFoundError
. It is a severe error and you cannot get past it (under normal circumstances). The most you can do is show an error message and exit.
Application.onError
seems to handle uncaught Errors like NoClassDefFoundError
, as well as Exceptions. So I think the best you can do is implement onError
and have it display an error page.
<!---- 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...");
}
}
Update
The Any type includes all error with the Java object type of
java.lang.Exception. It does not include java.lang.Throwable errors.
To catch Throwable errors, specify java.lang.Throwable in the cfcatch
tag type attribute
Despite what the documentation says, catching Throwable
does not work in any of my tests (or yours). That strongly suggests a bug in the behavior or the documentation. Either way it does not work as advertised, so as mentioned above, the only alternative I know of is using a general error handler. If you must stick with an Application.cfm file for some reason, try using <cferror type="exception" ...>
(Absurd) Test case:
<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>
NoClassDefFoundError
is an unchecked exception, are you sure ColdFusion catches those? – FeudalColdFusion
tag to your question so more people will see it. You have a couple of typos in that code example. The endingcftry
and there should not be any spaces between the pound-signs and the variable name,#cfcatch#
. The catch type of 'any' should get the error, not sure about the 'java.lang.Throwable' type? – ComoException
, not anError
like NoClassDefFound. (So it did not really work) In CF10, Application.onError seems to catch theError
. Need to do some more testing though. – GodderdNoClassDefFound
suggests a configuration problem which is not something you normally encounter in a production environment. Nor it is not something you can "fix" at runtime. So can you elaborate on what you are trying to do and why? Unfortunately, given thatcfcatch
does not handlejava.lang.Error
's, that leaves general error handlers. If those are out, that is pretty much the ball game afaik .. – Godderdcfcatch
does not catch java.lang.Error's. If you are stuck withApplication.cfm
, try using<cferror>
. – Godderd