異常捕獲的切面--java需要優雅嗎?

我是je的新人,大學剛畢業,入司後就一直在看別人的代碼。
今天看到前人的兩行註釋讓我思考——
……也許我所述不是問題for YOU,但是我迷茫
    public synchronized void putInCache(String cacheName, String key, Object value){
CacheExt cache= getCache(cacheName);
// if (cache == null) {
// throw new NeedsRefreshException("Cache is not exist");
// }
cache.putInCache(key, value);
}

爲什麼要註釋掉呢?可能是作者認爲調用它的代碼過濾了cache爲空的可能,例如:
   
public synchronized boolean hasCache(String cacheName) {
return cacheMap.getKeys().contains(cacheName);
}
……
if(hasCache(cacheName)) { putInCache(……);}
……

但下面:
    public synchronized Object getFromCache(String cacheName, String key){
CacheExt cache = getCache(cacheName);
if(cache == null)
return null;
try {
return cache.getFromCache(key);
} catch (NeedsRefreshException e) {
cache.cancelUpdate(key);
return null;
}
}

作者又在方法內部過濾這種異常,是作者的邏輯有問題嗎?
當面對外部對本方法調用有多種可能性,而每種可能性的處理又個不相同時,就出現這樣的問題:
本方法不能確定外部調用是否已經過濾了異常,而自己又很迫切的需要保證這一點時,你就得在自己內部過濾掉可能的異常。但是對於許多人來說:注意防止異常的發生是基本原則(至少老師是這麼教我的——),所以對於一個充分解耦的程序來說多級的調用中,或者是分組開發裏,出現這樣的調用A-調用->B-調用->C-調用->D-調用->E-調用->F-調用->G的調用棧,G是最終的方法即本方法,內部有過濾,同樣的A-調用->B有過濾,其他一樣,既
if (cache == null) {
throw new NeedsRefreshException("Cache is not exist");
}

出現多次,判斷N次(影響效率!?)。這樣我看起來很不爽,這麼麻煩!一點都不簡約,不樸素。
當然,也可以不處理這樣就簡約了,樸素了-
待續……去看奧運會開幕式——

接續:
也就是說在類的外部和內部都不處理這種異常(有這樣寫代碼的嗎?),假設程序中不會出現異常;或者捕獲這種異常的代價遠遠大於了重啓的代價——

當然,這裏依然還有一種方法,也就是整個系統的通用異常處理框架或機制。如此的話,在函數方法的內部和外部(不包含最外部)不用理睬過濾的事情了……

總結:當我們不確定異常發生的時機、異常處理的種類(也許有些異常出現後,可以使用默認參數代替,有些則報錯崩潰)、異常處理代價時,就出現了異常處理的切面問題,也就是說在哪裏會出現異常、哪裏需要處理異常、如果處理異常的問題!
我認爲有4種模式:
[color=darkred]
[list]
[*]原始社會模式——個體與個體之間社交的匱乏,可以忽略任何一個人的錯誤(對應不處理方式)
[/list]
[list]
[*]封建社會模式——個體在不經意見的錯誤會有官府等機制來糾正(對應方法外部過濾)
[/list]
[list]
[*]資本主義模式——當每個個體的意識和法制強度達到一定程度時,個體對外界是乾淨的(對應內部過濾)
[/list]
[list]
[*]社會主義模式——社會主義的每個公民都是優秀的,既是偶爾犯錯,也會有社會主義的政府來處理(對應統一框架或機制處理)
[/list]
[/color]

如果是這樣的話,我想Java代碼在我們面前突然就變得優雅起來。
但在日益複雜的系統裏,這可能實現嗎?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章