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

在Jython中捕获Java异常:SikuliX脚本VNC连接中断处理

解决SikuliX脚本中捕获VNC连接中断异常的问题

我之前在使用SikuliX结合VNC做自动化的时候也碰到过一模一样的问题,虚拟机重启触发的com.tigervnc.rdr.EndOfStream异常确实会打断脚本运行。好在Jython和Java完全兼容,我们可以直接捕获这个Java异常,让脚本继续执行,具体做法如下:

1. 捕获单个代码块的异常

如果你的VNC操作都在主线程或者你能控制的代码块里,直接用try-except包裹即可,注意要先导入对应的Java异常类:

# 导入Java端的异常类
from com.tigervnc.rdr import EndOfStream

try:
    # 这里放置你的SikuliX VNC相关操作,比如图像识别、点击、输入等
    click("login_button.png")
    type("admin", Key.TAB)
    type("password", Key.ENTER)
except EndOfStream as e:
    # 可选:打印异常信息用于调试
    print(f"VNC连接中断(可能是虚拟机重启): {str(e)}")
    # 忽略异常,让脚本继续往下执行
    pass

2. 处理后台线程抛出的异常

从你给出的堆栈信息来看,异常是在Thread-7这个后台线程里抛出的(SikuliX的VNCScreen内部线程),这种情况下直接包裹主线程代码可能捕获不到。这时候我们可以给Java线程设置全局的未捕获异常处理器,专门处理这个异常:

from java.lang import Thread
from com.tigervnc.rdr import EndOfStream

# 定义异常处理函数
def vnc_exception_handler(thread, throwable):
    # 判断是不是我们要忽略的VNC连接异常
    if isinstance(throwable, EndOfStream):
        print(f"后台线程 {thread.getName()} 发生VNC连接中断,已忽略异常")
    else:
        # 其他异常不处理,按默认逻辑抛出
        raise throwable

# 设置全局未捕获异常处理器
Thread.setDefaultUncaughtExceptionHandler(vnc_exception_handler)

# 这里开始你的主脚本逻辑
setup_vnc_connection()
run_automation_tasks()

关键说明

  • Jython可以直接访问Java的类和异常,所以我们能像捕获Python原生异常一样捕获EndOfStream
  • 如果你的脚本需要在异常后重新连接VNC,可以在except块或者处理器里添加重连逻辑,而不仅仅是忽略
  • 全局处理器会捕获所有线程的未捕获异常,所以要注意判断异常类型,避免误吞其他重要异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:08