【问题标题】:ColdFusion not catching NoClassDefFoundErrorColdFusion 没有捕捉到 NoClassDefFoundError
【发布时间】:2013-01-09 14:19:14
【问题描述】:

我正在使用 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>

但这不起作用。你能告诉我怎么做吗?我需要在特定位置捕获此错误,而不是在 Application.cfc 的 OnError 函数中。

【问题讨论】:

  • NoClassDefFoundError 是一个未经检查的异常,你确定 ColdFusion 能捕捉到这些吗?
  • 我已在您的问题中添加了ColdFusion 标签,以便更多人看到它。您在该代码示例中有几个拼写错误。结尾 cftry 并且在井号和变量名称 #cfcatch# 之间不应有任何空格。 'any' 的 catch 类型应该得到错误,不确定 'java.lang.Throwable' 类型?
  • 如果你的 catch 中有任何错误,它会抛出 CF 错误。正如 Miguel-F 所说,如果您的代码中存在这些空格,则表示语法错误并且 CF 反应正确。错误处理程序必须是完美的,否则它们基本上是无用的。
  • 我发现这篇关于 CF 8 的类似帖子 - <cfcatch> not 'catching' an error。请参阅以下@Leigh 的答案。试试看。
  • @Leigh 如此行事,还是您删除了您的答案?我再也看不到了。

标签: java coldfusion coldfusion-8


【解决方案1】:

现在我喝了更多咖啡,我认为cfcatch 无法赶上NoClassDefFoundError。根据文档,它只处理Exceptions

异常是破坏正常指令流的事件 在 ColdFusion 页面中,例如数据库操作失败、丢失 包括文件和开发人员指定的事件。

NoClassDefFoundError 是一个Error

一个错误表示严重的问题,一个合理的应用程序 不应该试图抓住

听起来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 对象类型的所有错误 java.lang.异常。它不包括 java.lang.Throwable 错误。 要捕获 Throwable 错误,请在 cfcatch 中指定 java.lang.Throwable 标签类型属性

尽管文档说了什么,但在我的任何测试(或您的测试)中捕获 Throwable 都不起作用。这强烈表明行为或文档中存在错误。无论哪种方式,它都像宣传的那样工作,所以如上所述,我所知道的唯一替代方法是使用通用错误处理程序。如果您出于某种原因必须坚持使用 Application.cfm 文件,请尝试使用 &lt;cferror type="exception" ...&gt;

(荒谬)测试用例:

<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>

【讨论】:

  • +1 这与他们在我引用的另一个问题(在 cmets 中)中得出的结论相同。我什至认为OP不再关注...
  • 是的,我也在那个线程上。完全忘记了cfcatch 直到我喝完剩下的咖啡才会有帮助,然后想“呃!”
  • 根据 Coldfusion 文档,我不能接受这个答案:Any 类型包括 java.lang.Exception 的 Java 对象类型的所有错误。它不包括 java.lang.Throwable 错误。要捕获 Throwable 错误,请在 cfcatch 标记类型属性中指定 java.lang.Throwable。 (livedocs.adobe.com/coldfusion/8/htmldocs/…)
  • @Abbadon - 遗憾的是,这不是文档中的第一个错误......也就是说 - 我不记得我上周运行的所有测试。但是,如果它对您不起作用,则表明它可能只是一个文档错误。稍后我将重新运行我的测试(使用 CF8),看看我会出现什么。
  • @Abbadon - 我重新运行了我的测试并且很确定文档是错误的。请参阅上面的更新回复。
猜你喜欢
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2020-10-19
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多