2013-01-09 49 views
1

我看起來像這樣的方法:的Java API反映封裝(該死的checked異常混亂)

public static <U extends Entity<?, ?>> Http<List<U>> getAllFromServerThreadRun(Integer maxResults, Class<U> clazz) { 
     JsonObject o2 = new JsonObject(); // TODO exception chaos im projekt 
              // überarbeiten 
     o2.addProperty("maxResults", maxResults); 

     String s; 
     Type t; 
     try { 
      U o = clazz.getConstructor().newInstance(); 
      s = (String) clazz.getDeclaredMethod("getControllerName").invoke(o); 
      t = (Type) clazz.getDeclaredMethod("getListType").invoke(o); 
     } catch (IllegalArgumentException e) { 
      ExceptionHandler.handle(e); 
     } catch (SecurityException e) { 
      ExceptionHandler.handle(e); 
     } catch (InstantiationException e) { 
      ExceptionHandler.handle(e); 
     } catch (IllegalAccessException e) { 
      ExceptionHandler.handle(e); 
     } catch (InvocationTargetException e) { 
      ExceptionHandler.handle(e); 
     } catch (NoSuchMethodException e) { 
      ExceptionHandler.handle(e); 
     } 
     return new Http<List<U>>(new HttpGet(), s, "getall", t).setParams(o2).queryServer(); 
    } 

也許他們中的10在我的項目存在,截至目前。

我有一個替代的Java反射庫,爲我隱藏這些例外?我不知道該如何處理它們,這只是混亂。

+0

「我不知道如何處理他們」,這是你需要理清的根源問題。在每種情況下,你真的想要發生什麼?在地毯下徹底的錯誤處理是一個不好的主意。 –

回答

4

我建議

catch (Exception e) { 
      ExceptionHandler.handle(e); 
} 
+0

hm好吧,我傻了。那麼我可以在任何地方做到這一點,並檢查.getClass()在handle()方法中的異常類型?那會是黃金路線嗎?在句柄()我拋出當然runtimeexception廢話例外權利? – cdbeelala89

+0

通常情況下,我會反對捕獲異常,但在這種情況下有很多,他們不從一個共同的異常繼承 – Bohemian

+0

如果您需要該類,則可以使用getClass。如何實際處理異常取決於您的應用程序以及您期望的Exception的含義。 –

2

在Java 7中,你可以在每個catch會捕獲多個異常類型:

try { 
    // reflection stuff 
} catch (IllegalArgumentException | 
     SecurityException | 
     InstantiationException | 
     etc e) { 
    ExceptionHandler.handle(e); 
} 

我很同情你想catch (Exception e)因爲拋出的多種類型的異常的反射方法,但這樣做會帶來無意中捕獲未檢查異常的危險,如可能掩蓋錯誤的NullPointerException

如果你仍然在Java 6的土地,你最好只是吮吸它恐怕。

+1

+1,更好。 「catch(Exception e)」也會捕獲意外的異常,並且可能隱藏令人討厭的錯誤。 –

0

從Java 7開始,所有與反射相關的異常擴展爲java.lang.ReflectiveOperationException,因此您只需要捕獲該異常。

其他異常(IllegalArgumentException和SecurityException)是未檢查的異常,根本不應該捕獲異常。如果發生任何一種情況,則代碼中存在錯誤。正確的做法不是捕獲異常,而是修復導致異常的代碼。

具體來說,我能看到的只是看着那拋出:IllegalArgumentException不會發生的代碼,因爲它只有當你傳遞一個對象來invoke這是不正確的類型出現,我可以看到你正在傳遞的一個實例你正在調用的方法非常類。並且SecurityException應該只發生在你根本不被允許訪問方法的情況下。