2015-01-16 63 views
2

我正在處理針對不同場景具有一些特定異常類型的第三方庫。我想使用它們像這樣(的略微簡化版本):處理無法訪問的異​​常類型

try 
{...} 
catch (IllegalFooOperationException e) 
{ 
    //handle an illegal foo 
} 
catch (InvalidBarValueException e) 
{ 
    //handles very differently from the illegal foo. 
} 

不幸的是,IllegalFooOperationExceptionInvalidBarValueException公開課:他們是包範圍的。他們繼承了更通用的公共類GenericThirdPartyAPIException類。

眼下,這個排序的作品:

catch (GenericThirdPartyAPIException e) 
{ 
    String rootExceptionTypeName = e.getClass().getName(); 
    if (rootExceptionTypeName.equals("someAPI.IllegalFooOperationException")) 
    { 
     //handle illegal foo 
    } 
    else if (rootExceptionTypeName.equals("someAPI.InvalidBarValueException")) 
    { 
     ... 
    } 
} 

但這只是感覺不對。一個潛在的問題是,如果將來該庫中的包或類名稱發生更改,此代碼將無法在運行時找到正確的異常類。如果不需要,我不喜歡依賴於在運行時計算對象的類。我也想直接解析異常消息,但是有一些我感興趣的異常(並非全部都顯示在這裏)可能具有相同的消息,但具有不同的類型。

有沒有更好的方法來處理這種情況?

+4

「但是,這只是感覺不對」 - 當圖書館設計師做出錯誤的選擇時會出現這種情況。你能否要求圖書館作者公開例外情況? –

+1

由於異常類型受軟件包保護,因此不能使用'instanceof'。 – Antoniossss

+0

@JonSkeet:我當然可以問,但無論他們是否回覆或者甚至願意進行更改,我仍然需要部署* my *代碼。 – FrustratedWithFormsDesigner

回答

2

在初始化中,您可以執行一個肯定會拋出的方法IllegalFooOperationException並將異常的類保存在變量中。 對其他異常做同樣的事情,你應該擁有所有的異常類。

我知道這不是一個好的做法(因爲包保護異常也是如此),但是您將能夠在運行時找到正確的異常類。

+1

現在,這是一個硬核解決方案........................... – Antoniossss

+0

ahah謝謝! :) – Gaetano

+0

嗯,這是一個有趣的想法! – FrustratedWithFormsDesigner

相關問題