標籤:c#
調試和錯誤處理
· 錯誤類型:
在編譯期間和運行期間,致命錯誤(語法錯誤)都會使應用程式完全失敗,語義錯誤或邏輯錯誤比較微妙,可能會使應用程式執行不正確,或者以未預料的方式執行;
我們在編寫代碼,把有協助的資訊輸出到output視窗中,以協助在IDE中進行調試。為此需要使用Debug和Trace系列函數,其中Debug函數在發布版本中會被忽略。對應投入生產的應用程式,應把調試輸出寫入記錄檔,在VS中,還可以使用跟蹤點輸出調試資訊;
可以通過斷點,判斷語句,或者在發生未處理的異常時,手工進行中斷模式(暫停應用程式的狀態)。可以在代碼的任意位置添加斷點,在VS中,還可以把斷點配置為僅在特定條件下中斷執行,在中斷模式下,可以檢查變數的內容(使用各種調試資訊視窗),每次執行一行代碼,以協助確定哪裡出現了錯誤;
異常時運行期間發生的錯誤,可以通過編程方式捕獲和處理這種錯誤,以防止應用程式終止。跳躍函數或處理變數時,可能會發生許多不同類型的異常,還可以使用throw關鍵字產生異常;
代碼中未處理的異常會使應用程式終止。使用try,catch和finally代碼塊處理異常。Try 塊標記了一個啟用異常處理的程式碼片段,catch塊包含的代碼僅在異常發生時執行,它可以匹配特定類型的異常,還可以保護多個catch 塊,Finally 塊指定異常處理完畢後執行的代碼,如果沒有發生異常,Finally 塊就指定在try塊執行完畢後執行的代碼,只能包含一個Finally塊,如果包含了catch 塊,Finally塊是可選的。
1.兩種方式執行應用程式:
· Debug
F5或按綠色play 按鈕
· 非debug
Debug |Start without debugging 或ctrl + F5
2.調試:如何使用調試技巧確定未按預期方式執行的那些代碼,並修改它們。
3.應用程式狀態:
1.非中斷模式(運行期間或正常執行)
Using system.diagnostics;
輸出調試資訊兩種方式:診斷輸出和跟蹤點
650) this.width=650;" style="float:none;" title="1.png" src="http://s3.51cto.com/wyfs02/M01/6C/E0/wKioL1VVWTCgowu4AAJmwMcHFJM680.jpg" alt="wKioL1VVWTCgowu4AAJmwMcHFJM680.jpg" />
診斷輸出:debug.writeline(); trace.writeline() (不常用)
診斷輸出:從應用程式中輸出調試結果時使用這種方法,尤其是在要輸出的字串比較複雜,涉及幾個變數或許多資訊的情況下,使用該方法比較好。如果要在發布模式下獲得執行應用程式的調試結果,trace命令是唯一選擇;
Debug模式下,記述在迴圈中計算出結果所採取的步驟;
Release 模式下,僅能看到計算的最終結果,因為沒有調用debug.writeline()函數;
650) this.width=650;" style="float:none;" title="2.png" src="http://s3.51cto.com/wyfs02/M01/6C/E5/wKiom1VVV7bzBWANAADB_HG7yBo876.jpg" alt="wKiom1VVV7bzBWANAADB_HG7yBo876.jpg" />
跟蹤點:是把資訊輸出到output視窗的另一種方法,是VS的一個功能。其作用和Debug.WriteLine()相同。只輸出調試資訊且不修改代碼;(常用)
650) this.width=650;" style="float:none;" title="3.png" src="http://s3.51cto.com/wyfs02/M02/6C/E0/wKioL1VVWTGAkoIeAADg2aSMab8746.jpg" alt="wKioL1VVWTGAkoIeAADg2aSMab8746.jpg" />
2.中斷模式調試
650) this.width=650;" style="float:none;" title="4.png" src="http://s3.51cto.com/wyfs02/M02/6C/E5/wKiom1VVV7fwoLmUAAE1I4scQts734.jpg" alt="wKiom1VVV7fwoLmUAAE1I4scQts734.jpg" />
650) this.width=650;" style="float:none;" title="5.png" src="http://s3.51cto.com/wyfs02/M00/6C/E0/wKioL1VVWTKyfQ-9AAEGi8J_F_0810.jpg" alt="wKioL1VVWTKyfQ-9AAEGi8J_F_0810.jpg" />
斷點:
650) this.width=650;" style="float:none;" title="6.png" src="http://s3.51cto.com/wyfs02/M00/6C/E5/wKiom1VVV7mzG4qVAASi0REuyXk353.jpg" alt="wKiom1VVV7mzG4qVAASi0REuyXk353.jpg" />
650) this.width=650;" style="float:none;" title="7.png" src="http://s3.51cto.com/wyfs02/M01/6C/E0/wKioL1VVWTaQHUGKAAM2qvHvTHE238.jpg" alt="wKioL1VVWTaQHUGKAAM2qvHvTHE238.jpg" />
650) this.width=650;" style="float:none;" title="8.png" src="http://s3.51cto.com/wyfs02/M01/6C/E5/wKiom1VVV7yS03DCAAHWqCCl-28928.jpg" alt="wKiom1VVV7yS03DCAAHWqCCl-28928.jpg" />
650) this.width=650;" style="float:none;" title="9.png" src="http://s3.51cto.com/wyfs02/M02/6C/E0/wKioL1VVWTfgOfxhAADK2QsSyQc154.jpg" alt="wKioL1VVWTfgOfxhAADK2QsSyQc154.jpg" />
4.監視變數的內容:
650) this.width=650;" style="float:none;" title="10.png" src="http://s3.51cto.com/wyfs02/M02/6C/E5/wKiom1VVV77Rx9WOAAHYV4mnYsg886.jpg" alt="wKiom1VVV77Rx9WOAAHYV4mnYsg886.jpg" />
5.逐步執行代碼
650) this.width=650;" style="float:none;" title="11.png" src="http://s3.51cto.com/wyfs02/M00/6C/E0/wKioL1VVWTnQwL7wAAFHHxocjaU305.jpg" alt="wKioL1VVWTnQwL7wAAFHHxocjaU305.jpg" />
6.Immediate 和command 視窗
650) this.width=650;" style="float:none;" title="12.png" src="http://s3.51cto.com/wyfs02/M00/6C/E5/wKiom1VVV7-Ai_sMAAEZ91JeB5k504.jpg" alt="wKiom1VVV7-Ai_sMAAEZ91JeB5k504.jpg" />
7.Call stack 視窗
650) this.width=650;" style="float:none;" title="13.png" src="http://s3.51cto.com/wyfs02/M01/6C/E0/wKioL1VVWTqycmU9AADrsWljEME711.jpg" alt="wKioL1VVWTqycmU9AADrsWljEME711.jpg" />
650) this.width=650;" style="float:none;" title="14.png" src="http://s3.51cto.com/wyfs02/M01/6C/E5/wKiom1VVV8GSKTKVAAJcPNaqZGg153.jpg" alt="wKiom1VVV8GSKTKVAAJcPNaqZGg153.jpg" />
8.錯誤處理,處理異常
Try … catch.. finally
650) this.width=650;" style="float:none;" title="15.png" src="http://s3.51cto.com/wyfs02/M02/6C/E0/wKioL1VVWT3ggMk_AAJ5eENECvY495.jpg" alt="wKioL1VVWT3ggMk_AAJ5eENECvY495.jpg" />
650) this.width=650;" style="float:none;" title="16.png" src="http://s3.51cto.com/wyfs02/M02/6C/E5/wKiom1VVV8SCLhuiAAGpFP0jZUg656.jpg" alt="wKiom1VVV8SCLhuiAAGpFP0jZUg656.jpg" />
650) this.width=650;" style="float:none;" title="17.png" src="http://s3.51cto.com/wyfs02/M00/6C/E0/wKioL1VVWT7ihG58AADHk_ZjSiE911.jpg" alt="wKioL1VVWT7ihG58AADHk_ZjSiE911.jpg" />
650) this.width=650;" style="float:none;" title="18.png" src="http://s3.51cto.com/wyfs02/M00/6C/E5/wKiom1VVV8XDMTzXAAG9F5Whi0Y473.jpg" alt="wKiom1VVV8XDMTzXAAG9F5Whi0Y473.jpg" />
9.列出和配置異常
Debug –exceptions—common language runtime exceptions.可看到system 名稱空間中的異常。
10.異常處理的注意事項
為比較特殊的異常提供catch 塊,catch塊順序錯誤,應用程式就會編譯失敗。
若使用throw,該異常不會有當前的try.. catch.. finally 塊處理
本文出自 “Ricky's Blog” 部落格,請務必保留此出處http://57388.blog.51cto.com/47388/1651512
16. C# -- 調試和錯誤處理