2013-01-09 4 views
6

ColdFusion 8を使用していますが、ColdFusionでNoClassDefFoundError例外をキャッチしたいのですが、できません。それでもエラーは失敗し、exception.logファイルにエラーが記録されます。ここで私が試したことがあります。NoClassDefFoundErrorをキャッチしないColdFusion

<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

'NoClassDefFoundError'未確認の例外、あなたはColdFusionがそれらをキャッチ確信しているがありますか? – fge

+0

あなたの質問に 'ColdFusion'タグを追加しましたので、もっと多くの人がそれを見ることができます。このコード例にはいくつかのタイプミスがあります。 'cftry'の終わりには、ポンド記号と変数名の間にスペースがあってはなりません、'#cfcatch# '。キャッチタイプが「any」の場合、java.lang.Throwableタイプについては不明なエラーが発生するはずです。 –

+1

キャッチにエラーがあると、CFエラーがスローされます。 Miguel-F氏によると、あなたのコードにこれらのスペースが存在する場合、構文エラーであり、CFが正しく反応しています。エラーハンドラは完璧でなければならず、または本質的に役に立たない。 – Travis

答えて

9

私はもっとコーヒーを持っていたので、cfcatchNoClassDefFoundErrorを捕まえることができるとは思いません。文書によると、それだけでExceptions処理します

インクルードファイルを欠落しているように失敗したデータベース操作など、ColdFusionページ内の命令 の通常の流れを中断させるイベントは、ある例外、および開発者が指定したイベントを。

NoClassDefFoundErrorErrorである。

エラーは、合理的なアプリケーション が

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..."); 
     } 
    } 

更新

任意のタイプ java.lang.ExceptionというJavaオブジェクトタイプのすべてのエラーを含みます。 java.lang.Throwableエラーは含まれません。 は、Throwableのエラーをキャッチ私のテスト(またはあなた)のいずれかで動作しませんThrowableを引く、ドキュメントが言うにもかかわらずのcfcatch タグのtype属性

でのjava.lang.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> 
+0

+1これは私が(コメントの中で)引用した他の質問に来たのと同じ結論です。私はOPがもう注意を払っているとは思っていません... –

+0

うん、私はあまりにもスレッド上にあった。私がコーヒーの残りを食べるまで、「cfcatch'は助けにならないことを完全に忘れてしまった。 – Leigh

+0

Coldfusionのドキュメントに従って、この回答を受け入れることはできません。Any型には、java.lang.ExceptionというJavaオブジェクト型のすべてのエラーが含まれています。 java.lang.Throwableエラーは含まれません。 Throwableエラーをキャッチするには、cfcatchタグのtype属性にjava.lang.Throwableを指定します。 (http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Errors_05.html) – Abbadon

関連する問題