You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Groovy使用@TimedInterrupt时出现Unexpected input编译错误

当前代码触发编译报错的根本原因是 @TimedInterrupt注解没有绑定任何可修饰的目标元素。
Groovy的AST转换注解必须附着在类、方法、闭包等具备语义的代码结构上,无法单独在方法体内部孤立存在。原代码在buildInterrupt方法内仅写了一行注解,没有对应的修饰对象,编译器解析到该位置时无法识别语法结构,因此抛出“Unexpected input”的解析错误。

原代码还存在两处会导致运行失败的问题:

  • 方法调用笔误:代码末尾调用time_method(),但实际定义的方法名为timeout_method,会触发运行时“方法不存在”的错误
  • 逻辑断裂:原本设计的buildInterrupt()调用没有实际作用,既没有通过这个方法生成带超时控制的执行单元,也没有将超时规则绑定到目标方法上

补充说明:@TimedInterrupt属于编译期生效的AST转换注解,无法在运行时动态为其他方法追加超时控制规则。注解的修饰关系在代码编译阶段就会被固定,不能通过返回注解本身的方式,给后续调用的方法自动叠加超时能力。

正确实现方式

最简化实现(直接修饰目标方法)

不需要额外的buildInterrupt方法,直接将@TimedInterrupt打在需要做超时控制的方法上即可:

import groovy.transform.TimedInterrupt
import java.util.concurrent.TimeUnit

@TimedInterrupt(value = 3L, unit = TimeUnit.MICROSECONDS)
def timeout_method() {
    println 'This is for testing: '
}

timeout_method()

保留buildInterrupt调用的实现

如果业务逻辑上必须保留buildInterrupt的调用流程,需要将注解绑定到方法内部定义的闭包上,返回经过AST转换的闭包供后续调用:

import groovy.transform.TimedInterrupt
import java.util.concurrent.TimeUnit

def buildInterrupt() {
    @TimedInterrupt(value = 3L, unit = TimeUnit.MICROSECONDS)
    def timeoutTask = {
        println 'This is for testing: '
    }
    return timeoutTask
}

// 按流程调用buildInterrupt获取带超时控制的执行单元
def task = buildInterrupt()
task()

注意:3微秒的超时阈值极短,正常代码的执行耗时很容易超过该阈值,运行上述代码后即可触发预期的TimeoutException。如果测试时未触发异常,可适当将超时值调大(比如设置为1000、单位用毫秒)验证逻辑有效性。

内容的提问来源于stack exchange,提问作者Eerama19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 02:06:07