#java #exception #jruby #throw #raise
#java #исключение #jruby #выбросить #поднять
Вопрос:
Я создал свой собственный компонент пользовательского интерфейса на Java. У него есть model, и несколько методов model могут вызвать мое исключение, называемое ModelException. Я хочу использовать этот компонент в JRuby, но я не могу вызвать исключение ModelException:
raise ModelException # it cause TypeError: exception class/object expected
Итак, я попытался создать метод, вызывающий ModelException в Java, а затем вызвать его в JRuby:
public class ScriptUtils {
private ScriptUtils() {
}
public static void throwModelException(ModelException e)
throws ModelException {
throw e;
}
}
но когда я вызываю исключение throwModelException из JRuby, я получаю:
org.jruby.exceptions.RaiseException: Native Exception: 'class app.ui.ModelException'; Message:
; StackTrace: app.ui.ModelException
...
Caused by: app.ui.ModelException
это собственное исключение не может быть обработано кодом Java.
Есть идеи, как выбросить исключение Java в JRuby и перехватить его в Java?
Комментарии:
1. 1 мне кажется, что выбрасывание исключения Java в JRuby и его перехват в коде Java должны поддерживаться. Все, что я знаю, это перехватить ScriptExpression, но это не позволяет тестировать конкретные исключения.
Ответ №1:
Это полная переписка моего первоначального ответа, поскольку я изначально неправильно прочитал ваш вопрос!
Вы можете создавать исключения Java и перехватывать их в JRuby, но вам нужно быть немного осторожным при вызове raise:
raise ModelException
Вызовет ошибку типа (как вы видели), потому что для JRuby ModelException
выглядит как обычная константа. Помните, что в Ruby имена классов являются константами. Вы можете создавать прямые подклассы Ruby Exception
следующим образом, например:
raise RuntimeError
Но я думаю, что такие подклассы являются особым случаем. Те, которые на самом деле являются классами Java, вам нужно вызывать с помощью конструктора:
raise ModelException.new
Или любые конструкторы, которые у вас есть для этого класса. Экземпляр ModelException
в JRuby является подклассом Exception
, потому что JRuby создает его как таковой, но сам класс Java таковым не является. Все это предполагает, что вы правильно импортировали свой ModelException
класс.
Что касается вашего второго примера, я вообще не смог воспроизвести эту ошибку. Пока я правильно создавал объект исключения, как указано выше, он работал, и я вообще не видел никаких жалоб на «собственное исключение». Так что я не уверен, что там происходит, извините.