2011-10-13 107 views
3

我已经在Java中创建了自己的UI组件。它有模型,一些模型的方法可以抛出我的异常叫做ModelException。我想用在JRuby中这个成分,但我不能提高我的ModelException:在JRuby中抛出Java异常并使用Java捕获它

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

于是,我在JRuby中创建方法在Java中抛出ModelException,然后调用它:

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

+0

+1在我看来,应该支持在JRuby中引发Java异常并将其捕获到Java代码中。我所知道要做的就是捕捉ScriptExpression,但不允许测试特定的异常。 – wberry

回答

0

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

可以提高Java异常,并赶上他们在JRuby中,但你必须要小心一点,你怎么称呼加注:

raise ModelException 

会导致错误类型(如你看到的),因为JRuby中ModelException样子一个普通的常量。请记住,在Ruby中,类名是常量。您可以提高红宝石Exception的直接子类这样的,例如:

raise RuntimeError 

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

raise ModelException.new 

或者其他任何构造函数。在JRuby中,ModelException的实例是Exception的子类,因为JRuby创建它,但Java类本身不是。所有这一切都假设你已经正确导入了你的ModelException类。

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