C#基礎(1) 異常實現基本錯誤處理
本文作為C#基礎知識的查漏補缺使用,所以並不全面.
參考書籍<<C#本質論>>,<<C#高階程式設計>>
- static void Main(string[] args)
- {
- WriteLine("Hello World!");
- string str_first_name;
- string str_age;
- int int_age;
- WriteLine("Hey you!");
- WriteLine("Enter your first name");
- str_first_name = ReadLine();
- WriteLine("Enter your age:");
- str_age = ReadLine();
- int.TryParse(str_age, out int_age);
- // int.TryParse 與 int.Parse 類似,但
- //是不會產生異常,轉換成功會返回true, 失敗會返回false,最後一個為輸出值,如果轉換失敗
- //則輸出值為0.
- // int.TryParse(n1.Text, out p_intNumber) 第一個引數代表被轉換的引數,
- // 第二個引數為轉換後的int型別, 成功則返回true, 失敗則返回false.
- WriteLine($"{str_first_name},You are {int_age*12} months old.");
- // ExceptionHandler();
- // ExTest();
- }
上面是正常的呼叫方式,
下面為會出現異常的方法
- /// <summary>
- /// 異常捕獲方法聯絡
- /// </summary>
- static int ExceptionHandler()
- {
- string firstName;
- string ageText;
- int age;
- int result = 0;
- WriteLine("Enter your first name:");
- firstName = ReadLine();
- WriteLine("Enter your age:");
- ageText = ReadLine();
- try
- {
- age = int.Parse(ageText);
- WriteLine($"Hi {firstName}! you are {age} years old.");
- }
- catch (FormatException)
- {
- WriteLine($"the age entered, {ageText}, is not valid.");
- result = 1;
- }
- finally
- {
- WriteLine($"Goodbye{firstName}");
- }
- return result;
- }
實現過程:首先try塊將可能引發的異常包圍起來,如果真的引發異常,那麼某個catch塊要嘗試處理這個異常,
try塊之後必須緊跟一個或者多個catch塊,(或者1個finally塊), catch塊可以選擇指定異常的資料型別.只要資料型別與異常型別匹配,對應的catch塊就會執行. 無論是否發生異常,最後都會執行finally 語句塊.finally塊的作用是提供一個最終位置,在其中放入無論是否發生異常都要執行的程式碼,finally塊最適合用來執行資源清理.
注意處理異常的資料型別非常重要.catch塊必須按照從最具體到最不具體排雷. System.Exception資料型別是最不具體的.
C#中的異常型別:(待學習)
Exception 所有異常物件的基類 SystemException 執行時產生的所有錯誤的基類 IndexOutOfRangeException 當一個數組的下標超出範圍時執行時引發 NullReferenceException 當一個空物件被引用時執行時引發 InvalidOperationException 當對方法的呼叫對物件的當前狀態無效時,由某些方法引發 ArgumentException 所有引數異常的基類 ArgumentNullException 在引數為空(不允許)的情況下,由方法引發 ArgumentOutOfRangeException 當引數不在一個給定範圍之內時,由方法引發 InteropException 目標在或發生在CLR外面環境中的異常的基類ComException 包含COM 類的HRESULT資訊的異常 SEHException 封裝win32 結構異常處理資訊的異常
規範:
避免從finally塊顯示的引發異常(因方法呼叫而隱式的引發的異常可以被接受)// 不理解...
要優先使用try/finally而不是try/catch塊來實現資源清理程式碼.
要在丟擲的異常中描述異常為什麼發生,如有可能,還有說明如何防範.