Создание исключения Java в JRuby и перехват его в Java - PullRequest
3 голосов
/ 13 октября 2011

Я создал свой собственный компонент пользовательского интерфейса на Java. У него есть модель, и некоторые методы модели могут вызвать мое исключение под названием 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 Ответ

0 голосов
/ 29 января 2012

Это полное переписывание моего первоначального ответа, поскольку я изначально неправильно прочитал ваш вопрос!

Вы можете вызывать исключения Java и отлавливать их в JRuby, но вам нужно быть немного осторожнее при вызове повышение:

raise ModelException

вызовет ошибку типа (как вы видели), потому что для JRuby ModelException выглядит как простая константа. Помните, что в Ruby имена классов являются константами. Вы можете поднять прямые подклассы Ruby Exception следующим образом, например ::10000

raise RuntimeError

Но я думаю, что такие подклассы - особый случай. Те, которые на самом деле являются классами Java, вам нужно вызывать с помощью конструктора:

raise ModelException.new

Или любой другой конструктор (ы) для этого класса. Экземпляр ModelException в JRuby является подклассом Exception, поскольку JRuby создает его как таковой, а сам класс Java - нет. Все это предполагает, что вы правильно импортировали класс ModelException.

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

...