我正在處理針對不同場景具有一些特定異常類型的第三方庫。我想使用它們像這樣(的略微簡化版本):處理無法訪問的異常類型
try
{...}
catch (IllegalFooOperationException e)
{
//handle an illegal foo
}
catch (InvalidBarValueException e)
{
//handles very differently from the illegal foo.
}
不幸的是,IllegalFooOperationException
和InvalidBarValueException
是不公開課:他們是包範圍的。他們繼承了更通用的公共類GenericThirdPartyAPIException
類。
眼下,這個排序的作品:
catch (GenericThirdPartyAPIException e)
{
String rootExceptionTypeName = e.getClass().getName();
if (rootExceptionTypeName.equals("someAPI.IllegalFooOperationException"))
{
//handle illegal foo
}
else if (rootExceptionTypeName.equals("someAPI.InvalidBarValueException"))
{
...
}
}
但這只是感覺不對。一個潛在的問題是,如果將來該庫中的包或類名稱發生更改,此代碼將無法在運行時找到正確的異常類。如果不需要,我不喜歡依賴於在運行時計算對象的類。我也想直接解析異常消息,但是有一些我感興趣的異常(並非全部都顯示在這裏)可能具有相同的消息,但具有不同的類型。
有沒有更好的方法來處理這種情況?
「但是,這只是感覺不對」 - 當圖書館設計師做出錯誤的選擇時會出現這種情況。你能否要求圖書館作者公開例外情況? –
由於異常類型受軟件包保護,因此不能使用'instanceof'。 – Antoniossss
@JonSkeet:我當然可以問,但無論他們是否回覆或者甚至願意進行更改,我仍然需要部署* my *代碼。 – FrustratedWithFormsDesigner