第63條 在細節(jié)消息中包含能夠捕獲失敗的信息

   當程序由于未被捕獲的異常而失敗的時候,系統(tǒng)會自動地打印出該異常的堆棧軌跡隅俘。在堆棧軌跡中包含該異常的字符串表示法(string representation)邻奠,即它的toString方法的調用結果。它通常包含該異常的類名为居,緊隨其后的是細節(jié)消息(detail message)碌宴。通常,這只是程序員或者域服務人員(field service personnel蒙畴,指檢查軟件失敗的人)在調查軟件失敗原因時必須檢查的信息贰镣。如果失敗的情形不容易重現,要想獲得更多的信息會非常困難忍抽,甚至是不可能的八孝。因此,異常類型的toString方法應該盡可能多地返回有關失敗原因的信息鸠项,這一點特別重要。換句話說子姜,異常的細節(jié)消息應該捕獲住失敗祟绊,便于以后分析楼入。
   為了捕獲失敗,異常的細節(jié)信息應該包含所有“對該異常有貢獻”的參數和域的值牧抽。例如嘉熊,IndexOutOfBoundsException異常的細節(jié)消息應該包含下界、上界以及沒有落在界內的下標值扬舒。該細節(jié)消息提供了許多關于失敗的信息阐肤。這三個值中任何一個或者全部都有可能是錯的。實標的下標值可能小于下界或等于上界(“越界錯誤”)讲坎,或者它可能是個無效值孕惜,太小或太大。下界也有可能大于上界(嚴重違反內部約束條件的一種情況)晨炕。每一種情形都代表了不同的問題衫画,如果程序員知道應該去查找哪種錯誤,就可以極大地加速診斷過程瓮栗。
   雖然在異常的細節(jié)消息中包含所有相關的“硬數據(hard data)”是非常重要的削罩,但是包含大量的描述信息往往沒有什么意義。堆棧軌跡的用途是與源文件結合起來進行分析费奸,它通常包含拋出該異常的確切文件和行數弥激,以及堆棧中所有其他方法調用所在的文件和行數。關于失敗的冗長描述信息通常是不必要的愿阐,這些信息可以通過閱讀源代碼而獲得秆撮。
   異常的細節(jié)消息不應該與“用戶層次的錯誤消息”混為一談,后者對于最終用戶而言必須是可理解的换况。與用戶層次的錯誤消息不同职辨,異常的字符串表示法主要是讓程序員或者域服務人員用來分析失敗的原因。因此戈二,信息的內容比可理解性要重要得多舒裤。
   為了確保在異常的細節(jié)消息中包含足夠的能捕獲失敗的信息,一種辦法是在異常的構造器而不是字符串細節(jié)消息中引入這些信息觉吭。然后腾供,有了這些信息,只要把它們放到消息描述中鲜滩,就可以自動產生細節(jié)消息伴鳖。例如IndexOutOfBoundsException并不是有個String構造器,而是有個這樣的構造器:
public class IndexOutOfBoundsException {
    public IndexOutOfBoundsException(int lowerBound, int upperBound, int index) {
        super("Lower bound:" + lowerBound + 
            ",Upper bound:" + upperBound + 
            ",Index:" + index);
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
        this.index = index;
    }
}
   遺憾的是徙硅,Java平臺類庫并沒有廣泛地使用這種做法榜聂,但是,這種做法仍然值得大力推薦嗓蘑。它使程序員更加易于拋出異常以捕獲失敗须肆。實際上匿乃,這種做法使程序員不想捕獲失敗都難!這種做法可以有效地把代碼集中起來放在異常類中豌汇,由這些代碼對異常類自身中的異常產生高質量的細節(jié)消息幢炸,而不是要求類的每個用戶都多余地產生細節(jié)消息。
   正如第58條中所建議的拒贱,為異常的“失敗捕獲”信息提供一些訪問方法是合適的(在上述例子中的lowerBound宛徊、upperBound和index方法)提供一些訪問方法是合適的。提供這樣的訪問方法對于受檢的異常逻澳,比對于未受檢的異常更為重要闸天,因為失敗——捕獲信息對于從失敗中恢復是非常有用的。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末赡盘,一起剝皮案震驚了整個濱河市号枕,隨后出現的幾起案子,更是在濱河造成了極大的恐慌陨享,老刑警劉巖葱淳,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異抛姑,居然都是意外死亡赞厕,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門定硝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿桑,“玉大人,你說我怎么就攤上這事蔬啡』逦辏” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵箱蟆,是天一觀的道長沟绪。 經常有香客問我,道長空猜,這世上最難降的妖魔是什么绽慈? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辈毯,結果婚禮上坝疼,老公的妹妹穿的比我還像新娘。我一直安慰自己谆沃,他們只是感情好钝凶,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著管毙,像睡著了一般腿椎。 火紅的嫁衣襯著肌膚如雪桌硫。 梳的紋絲不亂的頭發(fā)上夭咬,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天啃炸,我揣著相機與錄音,去河邊找鬼卓舵。 笑死南用,一個胖子當著我的面吹牛,可吹牛的內容都是我干的掏湾。 我是一名探鬼主播裹虫,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼融击!你這毒婦竟也來了筑公?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尊浪,失蹤者是張志新(化名)和其女友劉穎匣屡,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體拇涤,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捣作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了鹅士。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片券躁。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掉盅,靈堂內的尸體忽然破棺而出也拜,到底是詐尸還是另有隱情,我是刑警寧澤趾痘,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布慢哈,位于F島的核電站,受9級特大地震影響扼脐,放射性物質發(fā)生泄漏岸军。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一瓦侮、第九天 我趴在偏房一處隱蔽的房頂上張望艰赞。 院中可真熱鬧,春花似錦肚吏、人聲如沸方妖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽党觅。三九已至雌澄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杯瞻,已是汗流浹背镐牺。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁莉,地道東北人睬涧。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像旗唁,于是被迫代替她去往敵國和親畦浓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • 我們何妨做這一木一石呢检疫?復雜的事物讶请,總是有基礎的元素組成,從做基礎的元素開始屎媳,朝著最終的目標前進夺溢。 第二章,主要寫...
    泓澄閱讀 320評論 2 0
  • 一剿牺,1到3歲 寶寶很早就有了空間的感知企垦,寶寶從兩歲半到三歲,辨別平面圖形大小的能力急劇的增加晒来,也有人認為早期幼兒認...
    0e90f55d9889閱讀 3,067評論 0 0
  • CTeX專門提供了三種用于排版中文論文的文類钞诡,ctexbook、ctexrep湃崩、ctexart荧降,可以分別替換boo...
    MecZhang閱讀 1,143評論 0 1