2011-10-13 43 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類。

至於你的第二個例子,我根本無法複製那個錯誤。只要我正確創建了異常對象,如上所述,它工作正常,我根本沒有看到任何有關「本機異常」的抱怨。所以我不確定那裏發生了什麼,對不起。