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# 參考)
沒有留言:
張貼留言