1. 程式人生 > >獻身說法---修復bug時的一些小技巧

獻身說法---修復bug時的一些小技巧

throw 修復bug () 關閉 遠程 style pre col 文件

最近,修復了項目當中的一些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 someting
} } private void LogicA() { try { //Do someting } catch(Exception ex) { //Do someting } } private void LogicB() { try { //Do someting } catch(Exception ex) { //Do someting throw ex; } }
View Code

再仔細查看後發現,邏輯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時的一些小技巧