try的代碼必須是一個原子整體,只是爲了完成一個功能,不要什麼東西都往try裏邊塞。
還是以例子說明吧,下邊一個例子是檢查兩個標誌位,本來這兩個標誌位沒什麼相關性,但因爲被綁在了一起就產生了一些笑話。在一次真實的運行中,第一個isPass()出了異常,結果導致了接下去的語句沒有執行,輸出的結果成了兩個“unknow”,而實際上第二個sPass()若能執行,它的結果會是pass。
String[] subs = null;
try {
cdmaFtResult = cdmaBtResult = getResources().getString(
R.string.unknow);
subs = result.split(",");
cdmaBtResult = isPass(subs[2]);
cdmaFtResult = isPass(subs[3]);
} catch (Exception e) {
Log.e(TAG,
"failed to get cdma BT & FT result:\n"
+ e.toString());
}
後來,我把這段try分成了兩個,分別針對cdmaBtResult = isPass(subs[2]);和cdmaFtResult = isPass(subs[3]);兩條語句,並將日誌信息分別寫成了
"failed to get cdma BT result:\n" + e.toString());
和
"failed to get cdma FT result:\n" + e.toString());
這樣子就清晰多了,運行時也不會再相互干擾了。
其實,早有前輩高人警告過:try的目標應該儘可能明確,因爲一旦出了異常,錯誤的信息也比較明確並且好定位。不過似乎非得自己去中過招,以後纔會將這些規則不折不扣地執行下去。ok, you win.