コーヒーをたくさん飲んだので、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.lang.Exception の Java オブジェクト型のすべてのエラーが含まれます。java.lang.Throwable エラーは含まれません。Throwable エラーをキャッチするには、 cfcatch タグの type 属性で 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>