【问题标题】:Skip MissingPropertyException while using GroovyShell.evaluate使用 GroovyShell.evaluate 时跳过 MissingPropertyException
【发布时间】:2021-11-03 16:27:44
【问题描述】:

有没有办法在使用GroovyShell.evaluate时跳过MissingPropertyException

def sharedData = new Binding()
def shell = new GroovyShell(sharedData)
shell.evaluate("a=5; b=1") // works fine

// How to not get MissingPropertyException, or silently ignore property 'a'
shell.evaluate("a; b=1") // MissingPropertyException for 'a'

我知道 Expando 解决方案,有没有办法在不定义类的情况下做到这一点?

【问题讨论】:

  • "有没有办法在不定义类的情况下做到这一点?" - 如果您在脚本中引用它但从未定义它,您希望 a 评估它是什么?
  • 感谢@JeffScottBrown。我只想跳过评估​​a
  • "我只想跳过评估​​ a" - 语言不支持。如果您评估一系列语句,例如a; b=1,则无法告诉 Groovy 不评估 a。脚本中 a 的存在是对其进行评估的明确请求。
  • 您可以将其评估为空的Stringnull、数字零或您喜欢的任何其他默认值,但您不能完全跳过评估它。
  • @JeffScottBrown 谢谢,应该没问题。你有一些示例代码吗?

标签: groovy groovyshell groovy-console


【解决方案1】:

一种非常简单的方法是覆盖Binding.getVariable。 请注意,这非常简单:忽略“所有异常” - 您可能希望获得更好的日志记录或更准确的错误处理。

import groovy.lang.*

class NoOpBinding extends Binding {
    @Override
    Object getVariable(String name) {
        try {
            return super.getVariable(name)
        }
        catch (Throwable t) {
            println "Ignoring variable=`$name`"
            return null
        }
    }
}

def shell = new GroovyShell(new NoOpBinding())
shell.evaluate("a; b=1") // MissingPropertyException for 'a'
// → Ignoring variable=`a`
println shell.getVariable('b')
// → 1

【讨论】:

  • 我不会发布另一个答案,因为您的答案解决了问题。您可以在回答中建议一个小的改进 - new Binding([:].withDefault { null }) 这样您就可以使用现有的 Binding 类和一个返回 null 的映射,用于不存在的绑定。只需少写几行代码 :-) 干得好!
  • 这并没有解决“有没有办法在不定义类的情况下做到这一点?”的问题。 @ic10503 你想在不引入新类/类型的情况下这样做吗?
  • @cftrick 感谢您的回答。这比定义一个扩展 Expando 的新类更好吗?
  • @ic10503 你的意思是这种方法,你在stackoverflow.com/questions/69826801/… 中声明,你声称它不起作用?这至少有效(好吧,它不会出现在您的其他问题中,而是出于不同的原因)。如果您的家庭作业禁止定义课程,那么 Szymon 在第一条评论中建议的方法也可以。
【解决方案2】:

你可以这样做:

def binding = [:].withDefault { }
def shell = new GroovyShell(binding as Binding)

shell.evaluate 'a; b=1'

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2021-12-29
    相关资源
    最近更新 更多