獻身說法---修復bug時的一些小技巧
最近,修復了項目當中的一些bug,覺著有些思路可以分享出來供大家借鑒。
場景一 開發環境中系統正常運行,測試環境中,部分機器未能正常運行。
解決過程:遠程連接了測試環境中的機器,觀察了系統的運行情況,確實比較反常。查看日誌後,發現出現了“xxx文件未找到”的異常。確認文件存在後,最先想到的就是,xxx依賴文件不存在,導致xxx文件未能正確加載。使用分析工具分析xxx文件依賴項後,發現測試環境確實是缺少了某些文件。從開發環境手動拷貝xxx文件的依賴文件到測試環境後,系統運行正常。
劃重點:同一份代碼,A環境運行正常,B環境運行異常,最有可能的原因就是環境因素,比如網絡原因,磁盤權限原因,運行庫缺失等原因。具體的原因分析可以依賴軟件系統的日誌,如果日誌比較詳細合理的話,對於分析解決問題有著莫大的幫助。如果,由於一些原因,軟件系統沒有日誌,也可以查看一下操作系統的應用程序日誌。當然,操作系統的應用程序日誌對一些軟件系統崩潰會有記錄,但一般的異常情況不會記錄。
場景二 邏輯A執行完畢後執行邏輯B,邏輯B執行完後執行邏輯C。邏輯A、B、C均放在try{}catch(){}塊中,邏輯C未能正常執行。
解決過程:走讀代碼發現,邏輯A當中使用了try{}catch(){}塊,邏輯B當中也使用了try{}catch(){}塊,理論上來說,邏輯C是可以正常運行的。
private void MainFunc() { try { LogicA(); LogicB(); LogicC(); } catch(Exception ex) { //Do sometingView Code} } private void LogicA() { try { //Do someting } catch(Exception ex) { //Do someting } } private void LogicB() { try { //Do someting } catch(Exception ex) { //Do someting throw ex; } }
再仔細查看後發現,邏輯B的catch(){}塊中使用了throw 語句,當邏輯B中出現異常時,邏輯C自然就不會執行了。預期的結果是,邏輯C需要正常執行,采用的辦法是將邏輯C放入finally{}塊中,並記錄是否有異常發生,如果有異常發生,進行提示或記錄。
1 private void MainFunc() 2 { 3 bool hasError; 4 try 5 { 6 LogicA(); 7 LogicB(); 8 //LogicC(); 9 } 10 catch(Exception ex) 11 { 12 //Do someting 13 hasError = true; 14 } 15 finally 16 { 17 if(hasError) 18 { 19 //Do something 20 } 21 LogicC(); 22 } 23 }View Code
劃重點:在進行異常處理時,除了使用try{}catch(){}塊以外,必要的操作應該采用finally{}塊操作,確保資源被釋放,無論是文件句柄,網絡連接還是窗口關閉等。如果發生了異常,應該給出合適的提示,讓用戶清晰的知道,操作未能成功完成。
以上是修復bug過程中的一點兒小經驗、小技巧,望大家笑納。
獻身說法---修復bug時的一些小技巧