iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0
自我挑戰組

.net 後端起手式 30天認識 C# 系列 第 9

DAY 09 陳述式(四)

陳述式

今天會介紹本系列文最後一個陳述式,但陳述式並非只有這幾種。

例外狀況處理陳述式

有了例外狀況處理陳述式,使我們可以避免程式在出現問題時直接掛掉,或者當資料不如預期時,如昨天的非數字強轉數字等等。

例外狀況處理陳述式基本由這三個關鍵字 try catch finally 組成,分別敘述這三個的用途與使用時機。

try

程式碼在 try 的區塊內,如果執行時有出現任何錯誤不會使程式掛掉,而是在錯誤的句子跳躍,並把錯誤資訊丟給 catch,如果有 catch 的話。

try {
  // something...
}

因為你會用到的方法,在處理錯誤時都會 throw 所以才會到 catch 區塊內。

catch

catch 不能單獨寫,需要有 try 才可以使用,用途是接收錯誤資訊,並針對錯誤進行處理,如

catch (Exception ex) {
  //  somthing...
}

Exception 是所有錯誤的基類,所以可以用 Exception 接所有的錯誤,但你也可以針對各種錯誤做出相對應的處理如

catch (DivideByZeroException divideByZeroEx) {
  // 處理除 0 事件
}
catch (IndexOutOfRangeException indexOfRangeEx) {
  // 處理索引超出範圍事件
}
catch (Exception ex) {
  // 處理不在上述的事件
}

可以應對不同的事件做出不同的處理,講講例外類別幾個我常用的屬性

Message 取得描述目前例外狀況的訊息。

Source 取得或設定造成錯誤的應用程式或物件的名稱。

StackTrace 取得呼叫堆疊上即時運算框架的字串表示。

想要看更多的例外類別,或者實作一個自己的例外類別,都可以在文末參考連結看。

finally

try 與 catch 結束時都會進來 finally 區塊內,處理之後的行為,比較常見的如資料庫連線開啟後,如果發生錯誤事件可能會沒有正確關閉連線,所以連線關閉的方法往往會寫在 finally,無論成功失敗都會進來 finally 來關閉資料庫連線。

與 catch 一樣,需要有 try 才能使用。

知道這三個關鍵字後,我們可以依照上述的需求來排列成,try-catch, try-finally, try-catch-finally 這三種例外處理陳述式,知道每一個關鍵字的含意後,就能知道什麼情況該用哪一種方式來處理例外狀況了。

throw

要有 throw 才能使例外處理陳述式運作,如果沒有人拋錯的話,catch 就不會接到任何東西,如果有看原始碼的話,會發現每一個方法在撰寫時都會預先處理例外狀況。

我們也可以自己寫一個方法來丟 throw,throw 丟出去的東西當然就是我們的例外類別如

static void Main (string[] args) {
  try {
    TestThrow ();
  } catch (Exception ex) {
    Console.WriteLine ($"ex.Message : {ex.Message}");
    Console.WriteLine ($"ex.Source : {ex.Source}");
    Console.WriteLine ($"ex.StackTrace : {ex.StackTrace}");
  } finally {
    Console.ReadKey ();
  }
}
static void TestThrow () {
  throw new Exception ("QQ");
}

可以看到一個只貼錯誤的方法,執行這個方法後變會把例外類別給 catch 使用,catch 則印出例外類別的一些屬性,finally 則執行按下任意鍵的方法。

throw 不是只能丟基底類別,所有的例外類別都能丟,但為了易懂所以會丟符合的例外類別。

切記 throw 丟出時外層一定要有 catch 接,否則程式是會掛掉的,因為你的例外沒有被解決。

除錯方法

介紹了例外狀況處理陳述式,也順便介紹一下 VSCode 的除錯方法

我們可以在畫面左邊點擊左鍵增加中斷點,或者按下 F9 在目前行增加中斷點。

https://raw.githubusercontent.com/MMiooiMM/learn-csharp-in-30-days/master/figures/09/01.png

有了中斷點後,我們便可以開始基本的除錯了,跟著上面步驟增加中斷點後,程式便會在相對應的位置停下,我們可以觀察到

https://raw.githubusercontent.com/MMiooiMM/learn-csharp-in-30-days/master/figures/09/02.png

A 等同於 F5 :使程式繼續執行。
B 等同於 F10:逐步進行若碰到函式則不進入函式可繼續逐步執行。
C 等同於 F11:逐步進行若碰到函式則進入函式並可繼續逐步進行。
D 等同於 Shift + F11:跳出目前函式並可繼續逐步進行。
E 等同於 Ctrl + Shift + F5:重新啟動程式。
F 等同於 Shift + F5:關閉程式。

為什麼中斷點很重要呢?因為程式在執行過程中,我們可以藉由暫停程式運作,並觀察每一個變數所帶有的值,這使我們方便確認執行過程中,每一步都與自己預想的一樣。

https://raw.githubusercontent.com/MMiooiMM/learn-csharp-in-30-days/master/figures/09/03.png

一些小結論

今天介紹了如何排除錯誤以及找出錯誤的方式,也就是我們基本的 debug 技巧,這對撰寫程式有很大的幫助,至於 debug 的速度就取決於經驗與本身的其他技巧了。

感謝閱讀。

參考連結
例外狀況處理陳述式 (C# 參考) | Microsoft Docs
C# 各類常見Exception 異常信息 - 掃文資訊
Exception Class (System) | Microsoft Docs
[C#] 自訂例外處理 (Exception) | .NET 隨筆 - 點部落


上一篇
DAY 08 型別常用方法
下一篇
DAY 10 類別
系列文
.net 後端起手式 30天認識 C# 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言