为什么我无法捕获 Groovy 的 MissingMethodException?

Why Can't I catch Groovy's MissingMethodException?

我正在使用我的一种静态方法进行异常处理。我发现了 MissingMethodException(通过反复试验),但是当我编写代码来捕获它时,Grails 2.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.getGrailsDefaultDate(1)

Why isn't the exception being caught?

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

如果你把你的 DateUtility.getGrailsDefaultDate(1) 放在一个 try 块中,这个块有一个与之关联的 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!'
        }
    }

}