6

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>

しかし、これはうまくいきません。その方法を教えてください。OnErrorApplication.cfc の関数ではなく、特定の場所でこのエラーをキャッチする必要があります。

4

1 に答える 1

9

コーヒーをたくさん飲んだので、cfcatchNoClassDefFoundError. ドキュメントによると、それは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>
于 2013-01-09T18:01:29.873 に答える