Microsoft PowerPoint - 03_FlowControl.pptx

Similar documents
Microsoft Word - 第3章.doc

untitled

CHAPTER VC#

untitled

untitled

untitled

投影片 1

untitled

Microsoft PowerPoint - 06_迴圈2.pptx

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

untitled

Microsoft Word - ch03.doc

新・解きながら学ぶJava

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Microsoft Word - 6.doc

Microsoft PowerPoint - ch2.pptx

chp6.ppt

C/C++基礎程式設計班

《大话设计模式》第一章

840 提示 Excel - Excel -- Excel (=) Excel ch0.xlsx H5 =D5+E5+F5+G5 (=) = - Excel 00

Microsoft PowerPoint - Chapter4

<4D F736F F D DA5BFA6A1C476C1C92DBEC7ACECB8D5A8F728B57BB35D292E646F63>

ASP.NET MVC Visual Studio MVC MVC 範例 1-1 建立第一個 MVC 專案 Visual Studio MVC step 01 Visual Studio Web ASP.NET Web (.NET Framework) step 02 C:\M

Microsoft Word - 投影片ch13

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Microsoft PowerPoint - C_Structure.ppt

Microsoft Word - NEWch (P5-15).doc

PowerPoint 簡報

第一章 章标题-F2 上空24,下空24

If Close[Length]!= 0 Then B Close[Length] 是 Length 日前的 Close 不是 0 的話則執行 B % Number 以 Divisor 來求取除法並傳回剩下的部份和 Divisor 具備相同的符 號 格式 :Number % Divisor Numb

Object-Oriented Programming, Mid-term Test, 11/21/2000

¥¼©R¦W-5

Microsoft Word - CPMidTerm2010SpringSolution

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

<4D F736F F D B0D3B77EC3FEA7DEC3C0C476C1C9A5BFA6A1B8D5C3442DB57BA6A1B35DAD702DBEC7ACEC2E646F6378>

(Microsoft Word - wes _\246p\246\363\250\317\245\316LED\277O\305\343\245\334\252\254\272A.doc)

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Java 程式設計初階 第 5 章:基本輸出入 & 流程控制

Visual C# 2005程式設計

Microsoft PowerPoint - STU_C_Lang_CH05

運算子多載 Operator Overloading

######## First set of commands x <- 0.5; y <- 0 if (x>3) y <- 1 else y <- 2 ######## Second set of commands x <- 0.5; y <- 0 if (x>3) y <- 1 else ###

新版 明解C++入門編

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF


X6-04_How_do_I_write_a_com_port_communicate_program_of_XPAC_tc

投稿類別:資訊類

Microsoft Word C-A卷.docx

第3章.doc

( )... 5 ( ) ( )

迴圈控制 : for, while, repeat Textbook reading: Chapter 7. 固定次數迴圈 : for 指令. 假設有 k 個指令 C(1),..., C(k), 而我們要依序完成其中的 C(m),..., C(n), 語法為 for ( i in m:n) { C(

Microsoft Word - 01.DOC

Microsoft Word - ACI chapter00-1ed.docx

PowerPoint 簡報

Excel VBA Excel Visual Basic for Application

The Embedded computing platform

Microsoft PowerPoint - EmbSys101_Java Basics.ppt [相容模式]

Python_02

CC213

Microsoft Word - AEL0124-CH05

Microsoft Word - 投影片ch15

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

EJB-Programming-4-cn.doc

Java

碩命題橫式

Microsoft PowerPoint - VB14.ppt

四川省普通高等学校

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運算子以移至內附範例的詳細資料頁面 x && y 邏輯 AND 如果第一個運算元為 false,c# 就不會評估第二個運算元 條件 OR 運算子 此運算子具有的優先順序高於下一個區段且低於前一個區段 請注意, 您可以按一下運

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

untitled

Microsoft Word - Chap05.doc

Microsoft PowerPoint - java2012-ch13投影片.ppt

Microsoft PowerPoint - VB3

The golden pins of the PCI card can be oxidized after months or years

Microsoft PowerPoint - 07b1 Max and Sum.ppt [相容模式]

4

Microsoft Word - ch04三校.doc

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

FY.DOC

PowerPoint 簡報

Java 程式設計入門

0 0 = 1 0 = 0 1 = = 1 1 = 0 0 = 1

資料結構之C語言重點複習

untitled

Microsoft Word - CPMidTerm2011SpringSolution

國立北斗家商 107 學年度第 2 學期第二次期中考科目 : 計算機應用 計算機概論 IV 班級 : 商二 1 2 貿二 資二 綜二 1 作答方式 : 答案卡 選擇題共 33 題, 除第 1 題 4 分, 其餘每題 3 分, 注意作答時間 1. ( ) 使用 Visual Basic 程式語言 (

填 写 要 求 1. 以 word 文 档 格 式 如 实 填 写 各 项 2. 表 格 文 本 中 外 文 名 词 第 一 次 出 现 时, 要 写 清 全 称 和 缩 写, 再 次 出 现 时 可 以 使 用 缩 写 3. 本 表 栏 目 未 涵 盖 的 内 容, 需 要 说 明 的, 请 在

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

CHAPTER 1

ex

PowerPoint 簡報

<4D F736F F D20AC4FBDBDA4FBB67DA96CAABA2DA743A67EAFC5AAA95FA7B9BD5A5F2E646F63>

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

第一章.FIT)

大 綱 最 有 利 標 目 的 及 類 型 最 有 利 標 之 辦 理 方 式 準 用 最 有 利 標 取 最 有 利 標 精 神 最 有 利 標 之 類 型 及 其 相 關 規 定 適 用 最 有 利 標 準 用 最 有 利 標 及 取 最 有 利 標 精 神 作 業 程 序 及 實 務 分 析

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

Transcription:

第三章 流程控制與例外處理 3.1 3.4 程式除錯 3.2 重複結構 3.5 例外處理 3.3 break 與 continue 陳述式 備註 : 可依進度點選小節

3.1 三種方式 : 1. if. else ( 雙重或單一選擇 雙重或單一選擇 ) 2. if else if else ( 多重選擇兩種以上 多重選擇兩種以上 ) 3. switch ( 多重選擇兩種以上 ) 2

3.1.1 if else 選擇陳述式 3

4

If ( 條件式 ) 陳述式 ; 例 1 若單價 (price) 大於等於 1,000 元, 折扣 (discount) 八折, 否則折扣九折 if ( price>=1000) { } else { } discount=0.8 ; // price 大於等於 1,000 執行此敘述 discount=0.9 ; // price 小於 1,000 執行此敘述 5

例 2 年齡 (age) 是 10 歲 ( 含 ) 以下或 60 歲 ( 不含 ) 以上則票價 (price) 為 100 元, 否則為 200 元 寫法如下 : if (age<=10 age>60) { price=100 ; } else { price=200 ; } 6

巢狀 if 若 if 或 else 程式區塊內還有 if else 陳述式 試寫一個程式由鍵盤輸入兩個整數 (num1 和 num2), 1 若 num1=num2, 則顯示 num1=num2 2 若 num1>num2, 則顯示 num1>num2 3 若 num1<num2, 則顯示 num1<num2 7

8

// FileName: ifelse1.sln 01 namespace ifelse1 02 { 03 class Program 04 { 05 static void Main(string[] args) 06 { 07 int num1, num2; 08 Console.Write(" 請輸入第一個整數 (num1) : "); 09 num1 = int.parse(console.readline()); 10 Console.Write(" 請輸入第二個整數 (num2) : "); 11 num2 = int.parse(console.readline()); 12 if (num1 == num2) 13 { 14 Console.WriteLine("{0} = {1}", num1, num2); 15 } 9

16 else 17 { 18 if (num1 > num2) 19 { 20 Console.WriteLine("{0} > {1}", num1, num2); 21 } 22 else 23 { 24 Console.WriteLine("{0} < {1}", num1, num2); 25 } 26 } 27 Console.Read(); 28 } 29 } 30 } 10

3.1.2 if else if else 多重選擇陳述式 有兩個以上的條件式需要連續做判斷時 11

延續上一範例, 改用 if else if else 多重選擇陳述式來撰寫兩數比大小 12

// FileName: ifelseif1.sln 01 static void Main(string[] args) 02 { 03 int num1, num2; 04 Console.Write(" 請輸入第一個整數 (num1) :"); 05 num1 = int.parse(console.readline()); 06 Console.Write(" 請輸入第二個整數 (num2) :"); 07 num2 = int.parse(console.readline()); 08 if (num1 == num2) 09 { 10 Console.WriteLine("{0} = {1}", num1, num2); 11 } 12 else if (num1 > num2) 13 { 14 Console.WriteLine("{0} > {1}", num1, num2); 15 } 16 else 17 { 18 Console.WriteLine("{0} < {1}", num1, num2); 19 } 20 Console.Read(); 21 } 13

3.1.3 switch 多重選擇陳述式 使用上差異 1 if else if else 可使用多個不同條件式 2 switch 只允許用一個運算式 依其運算式結果判斷其值是落在哪個範圍 使用太多 if 使得程式看起來複雜且不易維護, switch 多重選擇陳述式則不會 14

15

Case 各種寫法 16

試使用 switch, 由鍵盤輸入現在的月份 (1~12), 1 輸入 5, 表 5 月份, 由程式判斷 5 月份是屬於哪一季? 顯示 現在是第二季 ; 2 若輸入值超出範圍, 則顯示... 輸入值超出範圍... 17

// FileName: switch1.sln 01 static void Main(string[] args) 02 { 03 string month; 04 Console.Write("=== 請輸入現在的月份 : "); 05 month = Console.ReadLine(); 06 switch (month) 07 { 08 case "1": 09 case "2": 10 case "3": 11 Console.WriteLine(" \n... 現在是第一季..."); 12 break; 13 case "4": 14 case "5": 15 case "6": 16 Console.WriteLine(" \n... 現在是第二季..."); 17 break; 18

18 case "7": 19 case "8": 20 case "9": 21 Console.WriteLine(" \n... 現在是第三季..."); 22 break; 23 case "10": 24 case "11": 25 case "12": 26 Console.WriteLine(" \n... 現在是第四季..."); 27 break; 28 default: 29 Console.WriteLine(" \n... 輸入值超出範圍..."); 30 break; 31 } 32 Console.Read(); 33 } 19

3.2 重複結構 重複結構是指設計程式時需要將某部份程式區塊重複執行指定的次數, 或一直執行到不滿足條件為止 重複結構亦稱迴圈 (Loop) for 陳述式指定次數者稱為 計數器計數器 控制迴圈控制迴圈 while 陳述依條件者稱為 條件式條件式 控制迴圈控制迴圈 三種結構的流程圖如下圖所示 : 20

21

3.2.1 for 迴圈 計數器控制迴圈以 for 的左大括號開始, 以右大括號結束 語法 : 22

中途欲離開 for 迴圈, 使用 break 陳述式 使用 continue, 立即跳回 for 的開頭繼續執行 23

一般 for 迴圈的常用寫法 : 1 for ( k=1 ; k<= 5 ; k++) k = 1 2 3 4 5 共執行迴圈內的程式區塊 5 次 2 for ( k=1 ; k<=5 ; k+=2) k = 1 3 5 共執行迴圈內的程式區塊 3 次 3 初值 增值可為小數 for ( k=-0.5 ; k<=1.5 ; k+= 0.5) k = -0.5 0 0.5 1.0 1.5 共執行迴圈內程式區塊 5 次 4 增值採遞減 for ( k=6 ; k>=1 ; k-=2) k = 6 4 2 共執行迴圈內的程式區塊 3 次 24

5 若初值 增值都有兩個以上, 中間使用逗號分開 : for (x=1, y=5 ; x<3 && y>2 ;x++, y-- ) x=1 & y=5; x=2 & y=4; 共執行迴圈內的程式區塊 2 次 6 初值和終值可以為運算式 for (k=x ; k<=y+9 ;k+=2) 若 x=1 y=-2, 則 k = 1,3,5,7 共執行迴圈內的程式區塊 4 次 7 無窮迴圈 for ( ; ; ) 25

試求下列級數的和 5 x= 1 (2x + 1) = 3 + 5 + 7 + 9 + 11 =? x=1 x=2 x=3 x=4 x=5 26

// FileName: series.sln 01 static void Main(string[] args) 02 { 03 int x, sum = 0; 04 Console.WriteLine ("\n === 求級數的總和 ==== \n"); 05 Console.WriteLine (" x 2x+1 "); 06 Console.WriteLine (" ======= ======= "); 07 for (x = 1; x <= 5; x++) 08 { 09 Console.WriteLine (" {0} {1} ", x, 2 * x + 1); 10 sum += 2 * x + 1; 11 } 12 Console.WriteLine (" ---------------------------- "); 13 Console.WriteLine (" 此級數總和為 : {0} \n", sum); 14 Console.Read(); 15 } 27

試寫一個程式將介於 5 到 30( 含 ) 是 3 的倍數顯示出來, 顯示時每 3 個倍數印一行 28

// FileName: for1.sln 01 static void Main(string[] args) 02 { 03 int k, count = 0; 04 for (k = 5; k <= 30; k++) 05 { 06 if ((k % 3) == 0) 07 { 08 Console.Write("{0} ", k); 09 count++; 10 if (count == 3) 11 { 12 Console.WriteLine(); 13 count = 0; 14 } 15 } 16 } 17 Console.Read(); 18 } 29

3.2.2 巢狀迴圈 若迴圈內還有迴圈就構成巢狀迴圈, 一般應用在二維資料列表 下例外迴圈的變數, 每個變數值印五次後, 再將游標移到 下一列最前面, 總共印五列 for (int i = 1; i <= 5; i++) { for (int k = 1; k <= 5; k++) { Console.Write("{0} ", i); } Console.WriteLine(); } 外迴圈 內迴圈 30

3.2.3 前測式迴圈 前測式迴圈就是將條件式放在迴圈的最前面 依條件式的真假決定是否進入迴圈 : 1 若滿足條件將迴圈內的程式區塊執行一次, 然後再回迴圈最前面條件式 2 不滿足時才離開迴圈 前測式迴圈, 若第一次進入迴圈時便不滿足條件式, 馬上離開迴圈, 連一次都沒執行迴圈內的程式區塊 31

32

3.2.4 後測式迴圈 後測式迴圈就是將條件式放在迴圈的最後面 第一次不用檢查條件式, 直接進入迴圈執行裡面的程式區塊, 才判斷條件式的真假 : 1 若滿足條件會將迴圈內的程式碼執行一次, 再檢查位於迴圈最後面的條件式 2 一直到不滿足條件時才離開迴圈 此種架構迴圈內的程式區塊至少會執行一次 33

34

試寫一個使用前測式迴圈計算階乘的程式, 由使用者先輸入一個整數, 接著再計算該數的階乘值 如下圖輸入 5, 結果計算出 5!=120 35

// FileName: factorial1.sln 01 static void Main(string[] args) 02 { 03 int keyin, num, factorial = 1; 04 Console.Write(" 請輸入整數 : "); 05 keyin = int.parse(console.readline()); 06 num = keyin; 07 while (num >= 1) 08 { 09 factorial *= num; 10 num -= 1; 11 } 12 Console.WriteLine("{0}! = {1} ", keyin, factorial); 13 Console.Read(); 14 } 36

3.3 break 與 continue 陳述式 當使用 for while 或 do while 迴圈時, 在迴圈內要中途離開迴圈時, 可在欲離開處插入 break 陳述式, 便可直接離開迴圈, 繼續執行接在迴圈後面的陳述式 若要中途返回迴圈開始處, 可在欲返回處插入 continue 陳述式 Break 和 continue 都是用來改變迴圈的執行流程 迴圈內接在 break 或 continue 後面的陳述式是不被執行 譬如一個無窮迴圈, 可在迴圈內適當位置插入 if 陳述式, 藉由在條件中插入 continue 和 break 來控制迴圈 37

38

39

試寫一個連續輸入數值累加總和的程式, 在無窮迴圈 do while 中, 透過 break 和 continue 來判斷是否繼續累加輸入值 40

// FileName: breakcontinue1.sln 01 static void Main(string[] args) 02 { 03 int count = 0, keyin = 0, sum = 0; 04 string str1; 05 do 06 { 07 Console.Write(" == 請輸入一個數值 : "); 08 keyin = Convert.ToInt32(Console.ReadLine()); 09 sum += keyin; 10 count++; 11 Console.Write(" == 是否繼續輸入 (Y/N)? : "); 12 str1 = Console.ReadLine(); 13 if ((str1 == "y") (str1 == "Y")) 14 { 15 continue; 41

16 } 17 else 18 { 19 break; 20 } 21 } while (true); 22 Console.WriteLine("\n == {0} 個數的總和 : {1} ", count, sum); 23 Console.Read(); 24 } 42

3.4 程式除錯 當程式執行若結果不符合預期, 錯誤可能發生在編譯階段或執行階段 一般編譯發生錯誤大都是語法錯誤, 表示所撰寫的陳述式不符合 C# 2008 所規定語法 此時在該識別字正下方出現藍色波浪線, 表示該識別字 C# 2008 無法辨別 此時便要做除錯 (Debug) 工作, 直到發生錯誤地方無誤時, 藍色波浪線才會消失 當一個程式在編譯時沒錯誤發生, 在執行階段若無法得到預期的結果, 表示發生邏輯上錯誤邏輯錯誤並不是語法錯誤, 而是程式的流程 運算式運算式 變數誤用等錯誤, 此時就需要使用 區域變數區域變數 視窗來做逐行偵錯, 觀察每行執行結果是否正確? 以找出發生錯誤的地方 43

3.4.1 逐行偵錯 Visual C# 2008 提供 區域變數區域變數 視窗來評估變數和運算式, 並保存其結果 可用 區域變數區域變數 視窗來編輯變數或暫存器的數值視窗來編輯變數或暫存器的數值 下例透過 for 迴圈來學習程式如何做逐行偵錯 首先自行鍵入下列程式, 或由書附光碟中載入 chap03/debug1.sln 來練習 44

// FileName: debug1.sln 01 static void Main(string[] args) 02 { 03 int i, k, sum = 0; 04 k = 11; 05 for (i = 1; i <= 3; i++) 06 { 07 k += 5; 08 sum += i; 09 Console.WriteLine("i={0}, k={1}", i, k); 10 } 11 Console.WriteLine("i={0}, sum = {1} ", i, sum); 12 Console.Read(); 13 } 上面程式執行時, 請按照下面步驟來對程式做逐行偵錯工作 45

Step1 先點選功能表的 偵錯 (D)/ 逐步執行 (I) 或直接或直接按鍵, 此時在 Main() 方法的下一行 { 會出現向右箭頭, 表示下次執行由此行陳述式開始, 進入逐行偵錯 : 46

Step2 點選 偵錯 (D)/ 視窗 (W)/ 區域變數 (L) 開啟 區域變數區域變數 監看視窗看視窗 47

Step3 按功能鍵三次, 已執行過 k = 11, 區域變數監看視窗內的 K 值由 0 11 48

Step4 接著按功能鍵六次, 執行 sum += 1 和 Console..., 此時區域變數監看視窗內的 sum 由 0 1, i 由 0 1, k 由 11 16 並執行 Console 陳述式, 此時會將 i 和 k 值按照設定顯示設定顯示格式顯示在式顯示在主控台視窗視窗 49

Step5 接著按功能鍵一次, 跳回執行 for... 陳述式, 將 i 值 1 2, 以此類推類推下去, 便可看到各陳述式中, 各變數的變變數的變化情形化情形 若要中斷逐行偵錯, 將尚未尚未執行的陳述式一次執行完畢, 可按開始偵錯鈕, 會顯示最後結果 50

3.4.2 設定中斷點 上節逐行偵錯是屬於逐行偵錯是屬於細部除錯 C# 2008 另提供中斷點設定做大範圍提供中斷點設定做大範圍除錯 設定中斷點做法 : 在程式中欲監看的陳述式前面設定中斷點, 程式每次執行到所設定的中斷點會停止執行, 此時可透過區域變數監看視窗或看視窗或移動滑鼠移動滑鼠到該變數上會顯示該變數目前的值前的值 51

52

Step1 設定中斷點先移動滑鼠移動滑鼠到下圖程式中有中斷點圖示處按處按一下, 將指定的三行陳述式設成中斷點中斷點 有設定中斷點的陳述式會預設紅色底紅色底顯示 : 53

Step2 開始偵錯 1 功能表 偵錯 (D)/ 開始偵錯 (S) 或直接按功能鍵, 開始執行到第一個中斷點處暫停 2 此時 k+=5 前出現向右箭頭, 表下次由此陳述式開始往下執行 3 可從 區域變數區域變數 監看視窗觀看目前變數的值監看視窗觀看目前變數的值 若螢幕未出現 區域變數區域變數 監看視窗, 行功能表 偵錯 (D)/ 視窗 (W)/ 區域變數 (L) 開啟開啟 區域變數區域變數 視窗視窗 54

Step3 直接觀看直接移動滑鼠移動滑鼠到編碼視窗到編碼視窗任一個變數上一個變數上停一會一會兒, 在該變數的右下方出現目前該變數的值前該變數的值 55

Step4 繼續執行 繼續執行 按功能鍵或鈕, 執行到 } 符號便暫號便暫停執行執行 各行陳述式中變數變行陳述式中變數變化情形化情形如下圖如下圖箭頭 56

Step6 停止偵錯若中途欲停止偵錯可以執行止偵錯可以執行 偵錯 (D)/ 停止偵錯 (E) 或直接按停止偵錯圖示即可止偵錯圖示即可 Step7 取消中繼點移動滑鼠到欲到欲取消取消中斷點陳述式前面的圖示上按一下, 中斷點便消失, 該行陳述式即恢復正常狀態 57

3.5 例外處理例外處理例外處理例外處理例外 (Exception) 就是指就是指就是指就是指當程式在執行時程式在執行時程式在執行時程式在執行時期所發生發生發生發生的錯的錯的錯的錯誤 C# 2008 提供一個提供一個提供一個提供一個具有結構且易控制的有結構且易控制的有結構且易控制的有結構且易控制的機制來制來制來制來處理處理處理處理執行時執行時執行時執行時期原期原期原期原程式程式程式程式未考慮未考慮未考慮未考慮的狀況狀況狀況狀況所發生發生發生發生的錯的錯的錯的錯誤稱為稱為稱為稱為 58 執行時執行時執行時執行時期原期原期原期原程式程式程式程式未考慮未考慮未考慮未考慮的狀況狀況狀況狀況所發生發生發生發生的錯的錯的錯的錯誤稱為稱為稱為稱為 例外處理外處理外處理外處理 設計設計設計設計良好良好良好良好的錯的錯的錯的錯誤處理誤處理誤處理誤處理程式碼區塊程式碼區塊程式碼區塊程式碼區塊, 可讓程式程式程式程式更為穩定, 且更不易不易不易不易因應因應因應因應用程式用程式用程式用程式處理處理處理處理此類錯誤而當機誤而當機誤而當機誤而當機

例外處理主要由 try catch throw finally 四個關鍵字構成 1 方式是將要監看是否發生錯誤的程式區塊放在 try 區塊內 2 當 try 區塊內的任何陳述式執行時發生錯誤, 該例外會被丟出 throw, 在程式碼中利用 catch 抓取此例外情況 3 C# 會由上而下逐一檢查每個 catch 陳述式, 當找到符合的 catch 陳述式, 會將控制權移轉到該 catch 陳述式內程式區塊的第一列陳述式去執行 4 當該 catch 程式區塊執行完畢, 不再繼續往下檢查 catch 陳述式 5 直接跳到 finally 內執行 finally 程式區塊 6 若未找到符合的 catch 陳述式, 最後也會執行 finally 內的 finally 程式區塊後才離開 try 59

try { [try 程式區塊 ] // 需例外處理的程式區塊 } catch(exception1 ex) { [catch 程式區塊 ] // 當需例外處理的程式區塊發生錯誤, 符合 exception1 時 // 執行此程式區塊 1; } catch(exception2 ex) { [catch 程式區塊 ] // 當需例外處理的程式區塊發生錯誤, 符合 exception2 時 } finally { } // 執行此程式區塊 2; [finally 程式區塊 ] // 無論是否發生例外, 都會執行此程區塊 60

61

試寫一個會發生除數為零 DivideByZeroException 例外程式或直接開啟下面 try1.sln 範例程式 本程式中先宣告 i k p 為整數變數, 並設定 i 初值為 5,k 初值為 0 當執行 i/k 時會發生除數為零的 DivideByZeroException 例外此時程式即會終止執行 62

// FileName: try2.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (Exception ex) 11 { 12 Console.WriteLine(" 發生例外 "); 13 } 14 finally 15 { 16 Console.WriteLine("... 結束程式執行!!..."); 17 } 18 Console.Read(); 19 } 63

只要此行發生發生錯誤, 會自動去找符合 catch 陳述式 執行第 8 行, 由於分母分母為零產生零產生錯誤, 此時會被第 10 行的 Exception 例外補捉外補捉到而產生 Exception 類別的 ex 例外物外物件, 接著在第 12 行直接印出 發生例外 訊息 最後執行第 14~17 行 finally 程式區塊, 顯示 "... 結束程式執行!!..." 結果 : 64

// FileName: try2.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (DivideByZeroException ex) 11 { 12 Console.WriteLine(ex.Message); 13 } 14 catch (Exception ex) 15 { 16 Console.WriteLine(ex.Message); 17 } 18 finally 19 { 20 Console.WriteLine("... 結束程式執行!!..."); 21 } 22 Console.Read(); 23 } 65

由於先符合 catch(dividebyzeroexception ex) 陳述式, 所以執行第一個 catch 內的程式區塊後, 跳過第二個 catch(exception ex) 陳述式, 直接執行 finally 陳述式的程式區塊 由於 catch (Exception ex) 是當上面所有 catch 陳述式中的 Exception 類別不符合時才執行, 也就是發生其它的錯誤才接受, 因此 catch(exception ex) 必須放在所有 catch 陳述式的最後面及 finally 前面 執行結果 66

下表列出幾個例個例外物外物件常用的屬用的屬性與性與方法, 透過這些方法可供方法可供你了解你了解一些例外的資訊資訊 67

延續上例, 使用例外物外物件的 GetType ToString Message Source StackTrace 成員將例將例外的資訊顯示出來 68

// FileName: try3.sln 01 static void Main(string[] args) 02 { 03 int i, k, p; 04 i = 5; 05 k = 0; 06 try 07 { 08 p = i / k; 09 } 10 catch (DivideByZeroException ex) 11 { 12 Console.WriteLine(" 例外訊息 :{0}", ex.message); 13 Console.WriteLine(" 發生例外的函式 :{0}", ex.stacktrace); 14 Console.WriteLine(" 發生例外的物件 :{0}", ex.source); 15 Console.WriteLine(" 發生例外的物件型別 :{0}", ex.gettype()); 16 Console.WriteLine(" 發生例外的文字說明 :{0}", ex.tostring()); 17 } 18 finally 19 { 20 Console.WriteLine("... 結束程式執行!!..."); 21 } 22 Console.Read(); 23 } 69