C# 入門指南 - 例外處理

編譯器 (compiler) 會直接抓語法錯誤 (syntax error) ,可是執行時發生的錯誤會導致程式 (program) 直接結束




encryptgui.cs 完整的範例程式碼,請參考encryptgui.cs


我們替 EncodeDecode 設計了防範空字串 (string) 的機制,可是假如使用者沒有先建立 Encrypt 型態 (type) 的屬性 (property) e ,就按下 EncodeDecode 的話,就會發生 NullReferenceException 的例外,導致程式直接結束。


C# 的例外處理 (exception handling) 很簡單,就把可能發生例外 (exception) 的程式碼放進 try 的程式區塊 (block) 中,然後處理發生例外後的程式碼放到 catch 的程式區塊內。像是 encodeButton_Click() 就要修改如下
private void encodeButton_Click(object sender, EventArgs e) {
    if (this.inputText == "") {
        this.displayLabel.Text = "This is Encode button. No input string!!";
    }
    else {
        try {
            this.outputText = this.e.toEncode(this.inputText);
            this.outputField.Text = this.outputText;
            this.displayLabel.Text = "This is Encode button. The result is above.";
        }
        catch (NullReferenceException nre) {
            this.displayLabel.Text = "This is Encode button. No Encrypt object!!";
        }
    }
}


trycatch 都是關鍵字 (keyword) 之一, catch 後用小括弧指名要抓取的例外型態,如此例為 NullReferenceException
catch (NullReferenceException nre) {
    this.displayLabel.Text = "This is Encode button. No Encrypt object!!";
}


假如同一段程式碼需要處理的例外有多種的話,每一種都需要用 catch 進行處理,因此有可能有多個 catch 陳述。


另外還有一個關鍵字 finally ,可放在所有 catch 的最後,這是只要例外發生都會執行的部份。


同樣 decodeButton_Click() 加入 try-catch 如下
private void decodeButton_Click(object sender, EventArgs e) {
    if (this.inputText == "") {
        this.displayLabel.Text = "This is Decode button. No input string!!";
    }
    else {
        try {
            this.outputText = this.e.toDecode(this.inputText);
            this.outputField.Text = this.outputText;
            this.displayLabel.Text = "This is Decode button. The result is above.";
        }
        catch (NullReferenceException nre) {
            this.displayLabel.Text = "This is Decode button. No Encrypt object!!";
        }
    }
}


再來編譯測試看看囉!輸入 "There is no spoon." ,然後點擊 Encode



做了例外處理,程式就 ok 囉!接下來我們來進行存檔與載入


中英文術語對照
編譯器compiler
語法錯誤syntax error
程式program
字串string
型態type
屬性property
例外處理exception handling
例外exception
區塊block
關鍵字keyword


您可以繼續參考
GUI 篇


相關目錄
回 C# 入門指南
回 C# 教材
回首頁


參考資料
http://msdn.microsoft.com/zh-tw/library/0yd65esw%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/zwc8s4fz%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/dszsf989%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/ms173160%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/ms173161%28v=vs.80%29.aspx
http://msdn.microsoft.com/zh-tw/library/ms173162%28v=vs.80%29.aspx

沒有留言: