java - tutorial - ColdFusion no detecta NoClassDefFoundError
coldfusion tutorial español (1)
Estoy usando ColdFusion 8. Me gustaría detectar una excepción NoClassDefFoundError
en ColdFusion, pero no puedo ... Todavía falla y registra el error en el archivo exception.log. Esto es lo que intenté.
<cftry>
<cfset myJavaObject.myMethod()>
<cfcatch type="any">
<cfdump var="#cfcatch #">
</cfcatch>
<cfcatch type="java.lang.Throwable">
Horrible exception.
<cfdump var="#cfcatch #">
</cfcatch>
</cftry>
Pero esto no funciona. ¿Podrías por favor mostrarme cómo hacer eso? Necesito detectar este error en un lugar particular y no en la función OnError
de mi Application.cfc.
Ahora que he tomado más café, no creo que cfcatch sea capaz de atrapar un NoClassDefFoundError
. De acuerdo con la documentación, solo procesa Excepciones :
Las excepciones son eventos que interrumpen el flujo normal de instrucciones en una página de ColdFusion, como operaciones fallidas de la base de datos, archivos faltantes incluidos y eventos especificados por el desarrollador.
NoClassDefFoundError
es un error .
Un error indica problemas graves que una aplicación razonable no debería intentar atrapar
Parece que cfcatch
solo fue diseñado para manejar problemas "recuperables" normales. Realmente no hay mucho que puedas hacer una vez que obtienes un NoClassDefFoundError
. Es un error grave y no se puede superar (en circunstancias normales). Lo máximo que puede hacer es mostrar un mensaje de error y salir.
Application.onError
parece manejar Errores no NoClassDefFoundError
como NoClassDefFoundError
, así como Excepciones. Así que creo que lo mejor que puedes hacer es implementar onError
y hacer que muestre una página de error.
<!---- 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...");
}
}
Actualizar
El tipo Cualquier incluye todos los errores con el tipo de objeto Java de java.lang.Exception. No incluye java.lang.Throwable errors. Para detectar los errores de Throwable, especifique java.lang.Throwable en el atributo de tipo de etiqueta cfcatch
A pesar de lo que dice la documentación, capturar Throwable
no funciona en ninguna de mis pruebas (ni en la tuya). Eso sugiere un error en el comportamiento o la documentación. De cualquier manera, no funciona como se anuncia, por lo que como se mencionó anteriormente, la única alternativa que conozco es usar un controlador de error general. Si, por alguna razón, tiene que quedarse con un archivo Application.cfm, intente con <cferror type="exception" ...>
(Absurdo) Caso de prueba:
<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>