程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> [C#] 學會處理異常,

[C#] 學會處理異常,

編輯:關於.NET

[C#] 學會處理異常,


學會處理異常

  C# 程序員可使用 try 塊對可能受異常影響的代碼進行分區。 關聯的 catch 塊用於處理任何結果異常。 一個包含代碼的 finally 塊,無論 try 塊中是否引發異常(例如,釋放在 try 塊中分配的資源),這些代碼都會運行。 一個 try 塊需要一個或多個關聯的 catch 塊或一個 finally 塊,或兩者。

  這裡分別給出了一個 try-catch 語句,一個 try-finally 語句,和一個 try-catch-finally 語句。

  try-catch:

 1         static void Main(string[] args)
 2         {
 3             try
 4             {
 5                 //需要執行的代碼
 6             }
 7             catch (Exception e)
 8             {
 9                 //這裡可以獲取到被捕獲的異常
10                 //你需要知道自己應該如何處理該異常
11             }
12         }

  try-finally:

1             try
2             {
3                 //需要執行的代碼
4             }
5             finally
6             {
7                 //在 try 塊後執行的代碼
8             }

  try-catch-finally:

 1             try
 2             {
 3                 //需要執行的代碼
 4             }
 5             catch (Exception e)
 6             {
 7                 //這裡處理異常
 8             }
 9             finally
10             {
11                 //在 try 塊(也可能是 catch 塊)後執行的代碼
12             }

  【備注】不帶有 catch 或 finally 塊的 try 塊將導致編譯器錯誤。

 

捕獲異常的 Catch 塊

  catch 塊可以指定要捕捉的異常的該類型。 類型規范稱為“異常篩選器”。 異常類型應從 Exception 派生出來。 一般而言,不會將 Exception 指定為異常篩選器,除非您了解如何處理 try 塊中可能引發的所有異常,或者您在 catch 塊中包括了 throw 語句。

  具有不同異常篩選器的多個 catch 塊可以串聯在一起。 多個 catch 數據塊的計算順序是在代碼中從頂部到底部,但是,對於所引發的每個異常,都只執行一個 catch 數據塊。 與指定的准確類型或其基類最為匹配的第一個 catch 塊被執行。 如果 catch 塊沒有指定匹配異常篩選器,則 catch 塊就不具有選定的篩選器(如果語句有的話)。 需要將帶有最具體的(即派生程度最高的)異常類的 catch 塊放在最前面。

  當下列條件為真時,應該捕捉異常:

  • 對引發異常的原因有具體的了解,並可實現特定的恢復,例如,在捕獲 FileNotFoundException 對象時提示用戶輸入新的文件名。

  • 可以新建一個更具體的異常並引發該異常。

 1         double GetNum(double[] nums,int index)
 2         {
 3             try
 4             {
 5                 return nums[index];
 6             }
 7             catch (IndexOutOfRangeException e)
 8             {
 9                 throw new ArgumentOutOfRangeException("Sorry, 你想要的索引已經超出界限!");
10             }
11         }

  希望在將異常傳遞出去進行時,我們通常會處理部分異常。 在下面的示例中,catch 塊用於在再次引發異常之前,添加錯誤日志,這是我們常用的做法。

 1             try
 2             {
 3                 //嘗試訪問系統資源
 4             }
 5             catch (Exception e)
 6             {
 7                 //偽代碼:記錄錯誤日志
 8                 log.Error(e);
 9 
10                 //再重新拋出錯誤
11                 throw;
12             }

 

釋放資源的 Finally 塊

  可以使用 finally 塊清理在 try 塊中執行的操作。 如果存在,finally 塊將在最後執行,在 try 塊和任何匹配 catch 的塊之後執行。 不管是否引發異常或者是否找到與異常類型匹配的 catch 塊,finally 始終運行。

  可以使用 finally 塊釋放資源(如文件流、數據庫連接和圖形句柄),而不用等待由運行時中的垃圾回收器來完成對象。 其實,我們更建議使用 using 語句。

  在下面的示例中,使用 finally 塊關閉在 try 塊中打開的文件。注意,在關閉文件之前要檢查該文件句柄的狀態。 如果 try 塊無法打開文件,則文件句柄仍具有值 null,並且 finally 塊不會嘗試關閉它。 或者,如果在 try 塊中成功打開該文件,則 finally 塊將關閉打開的文件。

 1         static void Main(string[] args)
 2         {
 3             FileStream fs = null;
 4             FileInfo fi = new System.IO.FileInfo("C:\\小二和小三的故事.txt");
 5 
 6             try
 7             {
 8                 fs = fi.OpenWrite();
 9                 fs.WriteByte(0);
10             }
11             finally
12             {
13                 // 記得判斷 null 哦,不然可能觸發其它異常
14                 if (fs != null)
15                 {
16                     fs.Close();
17                 }
18             }
19 
20         }

 

 


 

【博主】反骨仔

【原文】http://www.cnblogs.com/liqingwen/p/6193999.html 

【參考】微軟官方文檔

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved