3

我用 Java 创建了自己的 UI 组件。它有模型,模型的一些方法可以抛出我的异常,称为 ModelException。我想在 JRuby 中使用这个组件,但我不能引发我的 ModelException:

raise ModelException # it cause TypeError: exception class/object expected

所以我尝试在 Java 中创建抛出 ModelException 的方法,然后在 JRuby 中调用它:

public class ScriptUtils {

private ScriptUtils() {
}

public static void throwModelException(ModelException e)
        throws ModelException {
    throw e;
}
}

但是当我从 JRuby 调用 throwModelException 时,我得到:

org.jruby.exceptions.RaiseException: Native Exception: 'class  app.ui.ModelException';   Message:
; StackTrace: app.ui.ModelException
...
Caused by: app.ui.ModelException

Java 代码无法处理此本机异常。

任何想法如何在 JRuby 中抛出 Java 异常并在 Java 中捕获它?

4

1 回答 1

0

这是对我原来的答案的完全重写,因为我最初误读了你的问题!

您可以引发 Java 异常并在 JRuby 中捕获它们,但您需要注意如何调用 raise:

raise ModelException

将导致类型错误(如您所见),因为 JRubyModelException看起来像一个普通常量。请记住,在 Ruby 中,类名是常量。您可以像这样提出 Ruby 的直接子类Exception,例如:

raise RuntimeError

但我认为这样的子类是一个特例。那些实际上是您需要使用构造函数调用的 Java 类:

raise ModelException.new

或者您为该类拥有的任何构造函数。ModelException在 JRuby 中,的实例是 的子类,Exception因为 JRuby 是这样创建的,但 Java 类本身不是。所有这一切都假设您已ModelException正确导入您的课程。

至于您的第二个示例,我根本无法复制该错误。只要我正确地创建了异常对象,如上所述,它就可以工作,而且我根本没有看到任何关于“本机异常”的抱怨。所以我不确定那里发生了什么,抱歉。

于 2012-01-29T13:16:37.950 回答