Поймать исключение Java в Jython - PullRequest
0 голосов
/ 26 мая 2018

У меня есть исключение, которое я пытаюсь перехватить всякий раз, когда мое VNC-соединение прерывается (всякий раз, когда я перезагружаю свою ВМ), и я пытаюсь игнорировать его, чтобы продолжить мой сценарий 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)

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

@ abarnert Ты действительно спас мой день.Я столкнулся с той же проблемой, что и ОП.Код 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 не существует.), я хотел бы перехватить исключение, чтобы правильно обработать эту проблему.

Если я просто использую обычный "за исключением исключения«поймать исключение», программа просто прервет работу без какой-либо информации.Предполагается, что операторы print в секции finally и finally должны выполняться, но этого не произошло.Что я получаю, так это ничего не видя, когда вижу, что "ceptionDemo запускается ".

Я потратил несколько дней на решение этой проблемы, снова и снова ища в Google, не оставляя камня на камне.После нескольких дней исследований я понял, что при программировании на jython существует два вида исключений: одно - исключение Python, другое - исключение Java.Причиной этой проблемы является то, что jython или SikuliX в этом случае подавили java throwables.Я не очень знаком с jython, так что это всего лишь мое предположение, и оно не было проверено (я больше знаком с нативным Python и Java).

Сначала я сомневаюсь, что это ImageIO - проблема нативного пакета Java.Я написал простую демонстрацию java для тестирования ImageIO, дав неверный URL-адрес изображения, он отлично работал, было выбрано приятное «javax.imageio.IIOException: не удается получить поток ввода из URL».Тогда я знаю, что мое предположение верно.Java-исключение почему-то не очень хорошо обрабатывается в Jython или SikuliX.Дело в том, что даже если это является основной причиной, мне все еще нужен простой и эффективный способ решения этой проблемы.Я попробовал некоторые другие обходные пути, но ничего не так хорошо, как я ожидал.Существенная часть этой проблемы не в загрузке изображения, а в перехвате исключения.

Пока я просто не заменил «кроме Exception, err« на «кроме java.lang.Exception as err»,код работает как шарм. Я получил все распечатки, которые я ожидал.

Ваши сообщения действительно спасли мой день. Хорошая работа и большое спасибо.

Следующие ссылки очень полезны в моемрасследование:
javax.ImageIO методы молча завершаются ошибкой
всесторонне перехватывают исключения в Jython
https://www.jython.org/jythonbook/en/1.0/ExceptionHandlingDebug.html

Наконец, если были какие-либо советыЯ хотел бы предложить людям, которые находят этот пост, это должно быть " ОСТАВАЙТЕСЬ ОТ ЭТОГО ВИДА ПОЛУЧЕННОГО ШОБРИДНОГО ГИБРИДНОГО ЯЗЫКА ", Вы не получите ни целесообразности Python, ни надежности Javaединственное, что вы в итоге получите, - это большая трата вашего времени.

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

Обновлениеe в 2019-08-02:

В качестве продолжения этого поста я предлагаю вам сделку "купи один, получи больше бесплатно".Он содержит чертовское удивление, принесенное вам Jython и Sikuli X.

1, НЕ ИСПОЛЬЗУЙТЕ НИЧЕГО ЗАВИСИМОГО ОТ Netty в Jython.Это включает в себя httplib и urllib2, и т. Д. Он потерпит неудачу, если вы попытаетесь получить что-либо в цикле, вместо этого используйте Requests или java.net

для получения подробной информации, пожалуйста, обратитесь к этому сообщению: Почему этот цикл Jython завершается ошибкой после одного запуска?

2, НЕ ИСПОЛЬЗУЙТЕ функцию type () в Sikuli XЭта функция обычно используется в python для определения типа объекта, однако Sikuli X использует ее для имитации функции ввода с клавиатуры.Если вы настаиваете, вы должны сначала импортировать встроенный , а затем назвать его следующим образом:

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

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

для получения подробной информации, пожалуйста, обратитесь к следующим:

Какпроверить тип переменной с помощью функции «тип» в Sikuli https://answers.launchpad.net/sikuli/+question/239574

Вот некоторые подводные камни, с которыми я столкнулся в Jython и Sikuli X, если вам приходится работать с этими двумя вещами, удачи и пожеланийтебе весело.

0 голосов
/ 26 мая 2018

Как объяснено в Обработка и отладка исключений , вы обрабатываете исключения Java в Jython так же, как обрабатываете исключения Python:

Как указывалось ранее, это распространенная практика вJython для обработки исключений Java.Часто у нас есть Java-класс, который генерирует исключения, и они могут обрабатываться или отображаться в Jython точно так же, как и обработка исключений Python.

Исключение Java в том, что касается вашего кода,просто экземпляр некоторого Exception подкласса.

Конечно, в этом подклассе, например, java.lang вместо встроенного или другого модуля stdlib, и он (почти?) всегда будет иметь java.lang.Exceptionкак промежуточный предок, прежде чем вернуться обратно к Exception, но, как правило, вас это не волнует.

Итак, где бы вы ни вызывали код Java, который вызывает это исключение ... просто поместитеtry: / except Exception as e: или except java.lang.Exception as e: или более конкретный тип, так же, как при вызове кода Python.

...