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

在JRuby中抛出Java异常并在Java中捕获它,java,exception,jruby,throw,raise,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

我已经用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中捕获它吗?

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

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

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

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

raise ModelException.new
或者你为该类所拥有的任何构造函数。JRuby中的
modeleexception
的一个实例是
Exception
的一个子类,因为JRuby是这样创建它的,而Java类本身不是。所有这些都假设您正确导入了
modeleexception


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

+1在我看来,应该支持在JRuby中抛出Java异常并在Java代码中捕获它。我所知道要做的就是捕获ScriptExpression,但这不允许测试特定的异常。