1. 程式人生 > >C#基礎(1) 異常實現基本錯誤處理

C#基礎(1) 異常實現基本錯誤處理

本文作為C#基礎知識的查漏補缺使用,所以並不全面.

參考書籍<<C#本質論>>,<<C#高階程式設計>>

  1. static void Main(string[] args)
  2. {
  3. WriteLine("Hello World!");
  4. string str_first_name;
  5. string str_age;
  6. int int_age;
  7. WriteLine("Hey you!");
  8. WriteLine("Enter your first name");
  9. str_first_name = ReadLine();
  10. WriteLine("Enter your age:");
  11. str_age = ReadLine();
  12. int.TryParse(str_age, out int_age);
  13. // int.TryParse 與 int.Parse 類似,但
  14. //是不會產生異常,轉換成功會返回true, 失敗會返回false,最後一個為輸出值,如果轉換失敗
  15. //則輸出值為0.
  16. // int.TryParse(n1.Text, out p_intNumber) 第一個引數代表被轉換的引數,
  17. // 第二個引數為轉換後的int型別, 成功則返回true, 失敗則返回false.
  18. WriteLine($"{str_first_name},You are {int_age*12} months old.");
  19. // ExceptionHandler();
  20. // ExTest();
  21. }

上面是正常的呼叫方式,

下面為會出現異常的方法

  1. /// <summary>
  2. /// 異常捕獲方法聯絡
  3. /// </summary>
  4. static int ExceptionHandler()
  5. {
  6. string firstName;
  7. string ageText;
  8. int age;
  9. int result = 0;
  10. WriteLine("Enter your first name:");
  11. firstName = ReadLine();
  12. WriteLine("Enter your age:");
  13. ageText = ReadLine();
  14. try
  15. {
  16. age = int.Parse(ageText);
  17. WriteLine($"Hi {firstName}! you are {age} years old.");
  18. }
  19. catch (FormatException)
  20. {
  21. WriteLine($"the age entered, {ageText}, is not valid.");
  22. result = 1;
  23. }
  24. finally
  25. {
  26. WriteLine($"Goodbye{firstName}");
  27. }
  28. return result;
  29. }

實現過程:首先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塊來實現資源清理程式碼.

要在丟擲的異常中描述異常為什麼發生,如有可能,還有說明如何防範.