当前位置: 首页 > 知识库问答 >
问题:

在Jython中捕获java异常

微生雨泽
2023-03-14

每当我的VNC连接被终止时(每当我重新启动VM时),我都试图捕捉一个异常,并且我试图忽略它以继续我的Jython脚本。我不知道如何编写try catch语句来捕获异常,因为它起源于Java。这是一个sikuliX脚本

Exception in thread "Thread-7" com.tigervnc.rdr.EndOfStream: EndOfStream
        at com.tigervnc.rdr.FdInStream.readWithTimeoutOrCallback(FdInStream.java:192)
        at com.tigervnc.rdr.FdInStream.overrun(FdInStream.java:142)
        at com.tigervnc.rdr.InStream.check(InStream.java:37)
        at com.tigervnc.rdr.InStream.check(InStream.java:44)
        at com.tigervnc.rdr.InStream.check(InStream.java:45)
        at com.tigervnc.rdr.InStream.readS8(InStream.java:55)
        at com.tigervnc.rdr.InStream.readU8(InStream.java:64)
        at com.tigervnc.rfb.CMsgReaderV3.readMsg(CMsgReaderV3.java:50)
        at com.tigervnc.rfb.CConnection.processMsg(CConnection.java:67)
        at org.sikuli.vnc.VNCClient.processMessages(VNCClient.java:246)
        at org.sikuli.vnc.VNCScreen$1.run(VNCScreen.java:82)
        at java.lang.Thread.run(Unknown Source)

共有1个答案

姜良哲
2023-03-14

@abarnert你真的救了我一天。我遇到了与OP发布的相同的问题。jython代码如下:

################################################################
#               CONFIG DEFINITIONS
################################################################
#GOOD_IMAGE_URL = "http://192.168.1.15/11111111.png"
BAD_IMAGE_URL = "http://192.168.1.15/111111112222.png"

def exceptionDemo(urlPath):
    try:
        print "exceptionDemo is starting"
        myImg = imageio.ImageIO.read(URL(urlPath))
        if myImg is None:
            print "Img is None"
        else:
            print "Img is OK"
        return myImg
    #except Exception, err:
    except java.lang.Exception as err:
        print "Exception is here"
        print err
    finally:
        print "Finally is here"

此代码的目的是下载URLPATH指定的图像文件。当ulrPath是坏的(在本例中,111111112222.png不存在)时,我希望捕捉异常以便正确处理此问题。

如果我只是使用普通的“Except Exception,Err”来捕捉异常,程序将在没有任何信息的情况下中止。except和finally部分中的print语句本应执行,但却没有执行。看到“ExceptionDemo正在启动”后,我得到的是什么也没有。

我花了几天时间来处理这个问题,一次又一次地在谷歌上搜索,不遗余力。经过几天的研究,我了解到在jython中编程时有两种异常,一种是python异常,另一种是java异常。出现这个问题的原因是jython或SikuliX在本例中都抑制了java throwables。我对jython不是很熟悉,所以这只是我的猜测,而且还没有得到验证(我更熟悉原生Python和Java)。

起初,我怀疑是ImageIo--原生java包的问题。我写了一个简单的java演示来html" target="_blank">测试ImageIO,给出了错误的图像url,它工作得很好,一个很好的“javax.ImageIO.iioException:不能从url获取输入流”已经抛出。然后,我知道我的猜测是对的。java异常在jython或Sikulix中没有得到很好的处理。这里的重点是,即使这是根本原因,我仍然需要一个简单优雅的方法来处理这个问题。我尝试了一些其他的变通办法,但没有什么像我预期的那样好。这个问题的关键不是下载图像,而是捕捉异常。

直到我简单地将“Except Exception,Err”替换为“Except java.lang.Exception as Err”,代码才像魅力一样工作。

你的帖子真的救了我的命。干得好,非常感谢。

以下参考资料对我的研究非常有帮助:
javax.imageio方法静默失败
在Jython
https://www.jython.org/jythonbook/en/1.0/exceptionhandlingdebug.html" target="_blank">html
中全面捕获异常

最后,如果我想给发现这篇文章的人提供什么建议的话,那就是“远离这种半生不熟的混杂语言”,你既不会得到Python的便利性,也不会得到Java的健壮性,你最终得到的唯一的东西是浪费你的时间。

====================================================================

2019-08-02更新:

作为这篇文章的后续,我为你提供一个“买一送多”的交易。它包含了Jython和Sikuli X给你带来的惊喜。

有关详细信息,请参阅这篇文章:为什么这个Jython循环在一次运行后失败?

不要在Sikuli X中使用type()函数。这个函数通常在python中用于确定对象的类型,但是Sikuli X使用它来模拟键盘输入函数。如果您坚持,您应该先导入builtin,然后这样称呼它:

# -*- encoding: utf-8 -*-
import __builtin__

if __name__ == '__main__':
    a=10
    print __builtin__.type(a)

有关详情,请参阅以下各项:

 类似资料:
  • 在尝试我在方法中发现的多捕获特性时,一切都按预期正常工作。

  • 问题内容: 为什么Java中的某些异常未被捕获?这是代码由于没有处理的异常而完全失败。(Java版本1.4)。 我得到一个 但这有效 我懂了 我以为捕获异常会捕获所有异常?如何捕获Java中的所有异常? 问题答案: 因为某些异常不是源自-例如和。 基本上,类型层次结构是: 只能抛出派生类,因此,如果您抓住,那实际上就可以抓住一切。 ,以及任何异常,从获得 其他 比那些源自数作为 检查的异常 -他们

  • 我需要应用程序将错误写入位置。有没有我可以用Java异常处理做这件事?我已经在抛接IOerrors了,所以我不知道问题出在哪里……? 我正在从标准输入读取数据,并将其压缩并写入标准输出。 写入/dev/full不是引发异常...有没有关于如何引发异常的想法?

  • 为什么Java中的一些异常不被捕获?这是完全失败的代码,有一个未处理的异常。(Java版本1.4)。 我在线程“main”java中得到了一个 但这行得通 我在java中没有发现任何方法错误。lang.NoSuchMethodError: 我以为捕获异常会捕获所有异常?如何捕获java中的所有异常?

  • 问题内容: 如果我没记错的话,应该首先捕获Exception的子类。但是必须捕获任何RuntimeException和一个具体的经过检查的Exception,首先应该捕获它们吗? 这个命令正确吗?还是正确但错误的选择? 问题答案: 顺序是 先匹配的,然后执行 (正如JLS清楚地解释的)。 如果第一个catch匹配到异常,则执行,否则,将尝试下一个,并不断重复直到匹配或不匹配。 因此,在捕获异常时,

  • 问题内容: 我们在工作中使用JUnit 3,并且没有注释。我想在我们的代码中添加一个实用程序来包装它: 所以我尝试了这个: 但是,我认为Java无法在catch块中使用通用异常类型。 围绕Java限制,我该怎么做? 有没有办法检查变量的类型? 问题答案: 您可以传入Class对象并以编程方式进行检查。 我不确定您是否要重新扔球;重新抛出将同样导致测试失败/错误,但是从语义上讲我不会,因为它基本上意