Выбрасывание исключения Java в JRuby и его перехват в Java

#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 класс.

Что касается вашего второго примера, я вообще не смог воспроизвести эту ошибку. Пока я правильно создавал объект исключения, как указано выше, он работал, и я вообще не видел никаких жалоб на «собственное исключение». Так что я не уверен, что там происходит, извините.