我试图定义如下方法:
static def myMethod(expectedExceptionType, Closure closure) {
try {
closure()
} catch (expectedExceptionType e) {
println "Threw an exception: ${e.getMessage()}"
}
}
并使用以下内容运行它:
MyClass.myMethod(NullPointerException) {
doSomeStuff()
}
我基本上希望能够将一个类型传递给我的方法,然后使用该实际参数在我的方法的catch块中定义形式参数的类型。
这可能吗?
答案 0 :(得分:2)
可以在GroovyAssert#shouldFail中找到基于Java的解决方案。 Groovy版本看起来并没有太大的不同。但我建议只使用该类,因为它仍然是Groovy发行版的一部分
答案 1 :(得分:1)
您可以做的一件事是捕获异常并检查捕获的异常是否是您预期的异常的实例并执行操作。但问题是每个异常都会因为不同的原因而被抛出,并且您不能为不同的异常提供相同的处理代码。如果你这样做,为什么要抓住具体的一个呢?
答案 2 :(得分:1)
这是不可能的。虽然groovy允许在许多情况下进行动态类型,但在异常处理的情况下却不允许。与Java一样,Groovy在编译时需要一个具体的异常类型来在类文件中构建异常表。
正如prabugp所建议的那样,您可以通过捕获所有异常并使用Class.isAssignableFrom()
方法测试它们来在运行时处理此问题。例如:
static def myMethod(expectedExceptionType, Closure closure) {
try {
closure()
} catch (e) {
if (expectedExceptionType.isAssignableFrom(e.class)) {
println "Threw an exception: ${e.getMessage()}"
} else {
throw e
}
}
}