在JRuby中抛出Java异常并用Java捕获它

时间:2011-10-13 08:00:36

标签: java exception jruby throw raise

我用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捕获它?

1 个答案:

答案 0 :(得分:0)

这是对原始答案的完全重写,因为我最初错误地阅读了您的问题!

你可以在JRuby中引发Java异常并捕获它们,但你需要小心一点,如何调用raise:

raise ModelException

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

raise RuntimeError

但我认为这样的子类是一种特殊情况。那些实际上是你需要用构造函数调用的Java类:

raise ModelException.new

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

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