@ 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, если вам приходится работать с этими двумя вещами, удачи и пожеланийтебе весело.