Grails 为什么我不能捕获Groovy的MissingMethodException?

Grails 为什么我不能捕获Groovy的MissingMethodException?,grails,groovy,exception-handling,missingmethodexception,Grails,Groovy,Exception Handling,Missingmethodexception,我正在我的一个静态方法中处理异常。我通过反复试验发现了MissingMethodException,但当我编写代码捕获它时,Grails2.3.11忽略了catch块。甚至没有使用默认的异常。为什么没有捕获异常 package utility import java.text.SimpleDateFormat class DateUtility { static String getGrailsDefaultDate(String datetm) { def for

我正在我的一个静态方法中处理异常。我通过反复试验发现了MissingMethodException,但当我编写代码捕获它时,Grails2.3.11忽略了catch块。甚至没有使用默认的异常。为什么没有捕获异常

package utility

import java.text.SimpleDateFormat

class DateUtility {

    static String getGrailsDefaultDate(String datetm) {
        def format = new SimpleDateFormat("YYYYMMddHHmmss")
        try{
            def date = format.parse(datetm)
            date = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(date)
            datetm = date.toString()
        }
        catch(IllegalArgumentException iae){
            datetm = "An error occured retrieving the date"
        }

        catch(NullPointerException npe){
            datetm = "A date was not provided"
        }
        catch(java.text.ParseException pe){
            datetm = "Unparseable date"
        }
        catch(groovy.lang.MissingMethodException mme){
            datetm = "A missing method occured"
        }
        catch(Exception e){
            datetm = "default exception"
        }

        return datetm
    }

}
下面是应该引发缺少的方法异常的调用:

DateUtility.getGrailsDefaultDate1

为什么没有捕获异常

package utility

import java.text.SimpleDateFormat

class DateUtility {

    static String getGrailsDefaultDate(String datetm) {
        def format = new SimpleDateFormat("YYYYMMddHHmmss")
        try{
            def date = format.parse(datetm)
            date = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(date)
            datetm = date.toString()
        }
        catch(IllegalArgumentException iae){
            datetm = "An error occured retrieving the date"
        }

        catch(NullPointerException npe){
            datetm = "A date was not provided"
        }
        catch(java.text.ParseException pe){
            datetm = "Unparseable date"
        }
        catch(groovy.lang.MissingMethodException mme){
            datetm = "A missing method occured"
        }
        catch(Exception e){
            datetm = "default exception"
        }

        return datetm
    }

}
您的catch块只捕获从try块抛出的异常。try块中没有将抛出MissingMethodException的表达式,因此不会调用捕获MissingMethodException的catch块。这一切看起来都在按设计工作

如果将DateUtility.getGrailsDefaultDate1放在一个try块中,该try块具有一个与之关联的catch块,该catch块捕获MissingMethodException,则将调用该catch块

试试这个

class DateUtility {

    static String getGrailsDefaultDate(String datetm) {
        def format = new SimpleDateFormat("YYYYMMddHHmmss")
        try{
            def date = format.parse(datetm)
            date = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss z").format(date)
            datetm = date.toString()
        }
        catch(IllegalArgumentException iae){
            datetm = "An error occured retrieving the date"
        }

        catch(NullPointerException npe){
            datetm = "A date was not provided"
        }
        catch(java.text.ParseException pe){
            datetm = "Unparseable date"
        }
        catch(groovy.lang.MissingMethodException mme){
            datetm = "A missing method occured"
        }
        catch(Exception e){
            datetm = "default exception"
        }

        return datetm
    }

    static void main(args) {
        try {
            DateUtility.getGrailsDefaultDate(1)
        } catch (MissingMethodException mme) {
            println 'I Caught The Exception!'
        }
    }

}

您可以在上述方法之外调用它。“你有没有尝试过用上述方法以外的方法来捕捉它,即:你把它叫在哪里?”tim_yates说,确实有效。在我的方法中,引发MissingMethodException的行是def date=format.parsedatetm,其中用1替换datetm。为什么我不能在DateUtility类中捕获带有整数1的异常?或者字符串1?整数1,如OP中所示。您确定在format.parsedatetm处引发异常吗?您指定getGrailsDefaultDate接受字符串,您是对的。我想tim_yates不觉得他们需要发布官方答案,所以我会接受你的答案,因为你经历了麻烦。我确实希望在方法中捕获异常,因此我将参数类型从String更改为def。谢谢。我没有读评论,所以没有看到蒂姆在那里回应。如果他发布了相同的答案,请将“接受”移动给他。我真的不在乎得到绿色支票。我是想帮忙。