C# 快速導覽 - 例外處理

寫程式難免會有錯誤 (error) ,例如以下程式

class Demo {
    static void Main() {
        string a = "There is no spoon."
        System.Console.WriteLine(a);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:exception1.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行,結果如下



這是語法錯誤 (syntax error) ,因為第 3 行少寫了一個分號
String a = "hello"


通常編譯器 (compiler) 會直接幫我們挑出這類的錯誤,並且提供錯誤發生的相關訊息。例如此例中錯誤發生在第 3 行,因為第 3 行缺少分號,所以編譯器告訴我們第 4 行的 System 是無法辨別的符號。


程式有可能會發生三種錯誤,語法錯誤是其中之一,有一種語意錯誤 (semantic error) ,程式會順利執行,但會得到錯誤的結果。如下例
class Demo {
    static void Main() {
        int i = 1;
        int sum = 0;
        while (i < 100) {
            sum += i;
            i++;
        }
        
        System.Console.WriteLine("1 + 2 + ... + 99 + 100 = {0}", sum);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:exception2.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行,結果如下



此例中我們想計算 1 到 100 所有正整數的總和,正確的結果應該是 5050 ,可是程式卻算出 4950 ,為什麼呢?因為第 5 行
while (i < 100) {


這裡的條件 (condition) 只會讓 sum 加到 99 為止,若 i 等於 100 就會結束迴圈,因此 while 迴圈 (while loop) 的結束條件應該是 i <= 100 或 i < 101 。


語法錯誤會被編譯器直接挑出,而語意錯誤需要依賴程式設計師自己清楚規劃程式的邏輯。另外一種錯誤通常在執行中發生錯誤,例如
class Demo {
    static void Main() {
        object o2 = null;
        int i2 = (int) o2; 
        System.Console.WriteLine(o2);
        System.Console.WriteLine(i2);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:exception3.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行,結果如下



錯誤發生在第 4 行
int i2 = (int) o2;


這裡發生了 object 不能轉換型態成 int 的錯誤,類似這樣的錯誤被稱為例外 (exception) 。


事實上,凡是有可能發生例外的地方,相關程式碼都必須放在 try-catch 陳述 (statement) 之中, try-catch 都是關鍵字 (keyword) 之一,專門用作例外處理 (exception handling) 。


因此,上述範例要能順利執行需要改成
class Demo {
    static void Main() {
        try {
            object o2 = null;
            int i2 = (int) o2; 
            System.Console.WriteLine(o2);
            System.Console.WriteLine(i2);
        }
        catch (System.Exception e) {
            System.Console.Write("something wrong: ");
            System.Console.WriteLine(e.ToString().Substring(0, 29));
        }
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:exception4.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行,結果如下



中英文術語對照
錯誤error
語法錯誤syntax error
編譯器compiler
語意錯誤semantic error
條件condition
while 迴圈while loop
例外exception
方法method
陳述statement
關鍵字keyword
例外處理exception handling


您可以繼續參考
例外處理


相關目錄
回 C# 快速導覽
回 C# 教材
回首頁


參考資料
Standard ECMA-334 C# Language Specification
msdn: 例外處理陳述式 (C# 參考)

沒有留言: