Я задаюсь вопросом, как я могу поймать любой повышенный объект (т.е. тип, который не расширяется Exception
), и все еще получите ссылку на него.
Я столкнулся с требованием сделать это при использовании Jython. При вызове метода Java, если тот метод повышает исключение, он не расширит Python Exception
класс, таким образом, блок как это не поймает его:
try:
# some call to a java lib that raises an exception here
except Exception, e:
# will never be entered
Я могу сделать это, но тогда у меня нет доступа к объекту исключения, который был повышен.
try:
# some call to a java lib that raises an exception here
except:
# will enter here, but there's no reference to the exception that was raised
Я могу решить это путем импорта типа исключительной ситуации Java и ловли его явно, но это делает трудным/невозможным записать универсальные обертки/декораторов обработки исключений.
Есть ли способ поймать некоторое произвольное исключение и все еще получить ссылку на него в except
блок?
Я должен отметить, что надеюсь на декоратора обработки исключений, которого я делаю, чтобы быть применимым с проектами Python, не только с проектами Jython. Я хотел бы постараться не импортировать java.lang.Exception
потому что это просто делает его Jython-только. Например, я полагаю, что могу сделать что-то вроде этого (но я не попробовал его), но я хотел бы избежать его, если я могу.
try:
# some function that may be running jython and may raise a java exception
except (Exception, java.lang.Exception), e:
# I imagine this would work, but it makes the code jython-only
Можно ссылаться на исключения с помощью модуля sys
. sys.exc _ info
- кортеж типа, экземпляра и отслеживания.
import sys
try:
# some call to a java lib that raises an exception here
except:
instance = sys.exc_info()[1]