在JRuby中抛出Java异常并在Java中捕获它
我已经用Java创建了自己的UI组件。它有一个模型,一些模型的方法可以抛出我的异常ModelException。我想在JRuby中使用此组件,但无法引发ModelException:在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
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 JRubyModelException
看起来像一个普通常量。记住,在Ruby中,类名是常量。您可以像这样引发RubyException
的直接子类,例如:
raise RuntimeError
但我认为这样的子类是一个特例。那些实际上是需要使用构造函数调用的Java类:
raise ModelException.new
或者你为该类所拥有的任何构造函数。JRuby中的modeleexception
的一个实例是Exception
的一个子类,因为JRuby是这样创建它的,而Java类本身不是。所有这些都假设您正确导入了modeleexception
类
至于你的第二个例子,我根本无法复制这个错误。只要我正确地创建了异常对象(如上所述),它就工作了,而且我没有看到任何关于“本机异常”的抱怨。所以我不确定那里发生了什么,抱歉。+1在我看来,应该支持在JRuby中抛出Java异常并在Java代码中捕获它。我所知道要做的就是捕获ScriptExpression,但这不允许测试特定的异常。