[C#] 學會處理異常

来源:http://www.cnblogs.com/liqingwen/archive/2016/12/19/6193999.html
-Advertisement-
Play Games

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


學會處理異常

  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 

【參考】微軟官方文檔


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 SELECT 2 TABLE_NAME, -- 表名 3 COLUMN_NAME, -- 欄位名 4 DATA_TYPE, -- 欄位類型 5 COLUMN_COMMENT -- 欄位註釋 6 FROM 7 INFORMATION_SCHEMA.COLUMNS 8 WHERE TABLE... ...
  • 在調優過程中的查詢語句優化階段,分析語句的執行計劃是必經之路,一款好的執行計劃分析工具確實可以幫助我們事半功倍 一款名為“Plan Explorer“,自己用的挺爽,不私藏了,分享給大家 小貼士:Plan Explorer是將Plan Explorer 專業版與免費版整合在一起發佈的全新、完全免費版 ...
  • 1.首先運行如下命令 sudo apt-get install wget bc build-essential gawk genisoimage 2.下載如下資源,make all 即可 http://pan.baidu.com/s/1nvc09yp 本來有此兩條已經足夠了,發佈時卻來了個不足 15 ...
  • 隨著我們使用電腦的時間越來越久,電腦C盤的空間會出現不夠用的情況,這時我們需要的就是增加C盤的大小,基本上有兩種方式 1.通過系統自帶的磁碟管理(有可能沒法操作,主要介紹第二種) 2.通過分區軟體進行磁碟調整 1.直接百度diskgenius,下載最新的軟體 2.參照http://jingyan.b ...
  • 打開伺服器系統c盤,打開window, 右鍵temp 屬性 安全 編輯 添加IIS_IUSRS 用戶控制許可權添加修改和寫入許可權即可。這是Windows Server 2008 R2 標準版 SP1 64位中文版解決辦法。 ...
  • 1、控制面板》程式和功能》打開或關閉Windows功能 > Internet信息服務 > 萬維網服務 > 應用程式開發功能 > ASP.NET(看這個是否選上); 2、“處理程式映射”中缺少ASP.NET 4.0的映射,需要添加映射。操作方法:在管理員身份打開命令行,運行以下命令: C:\Windo ...
  • 裝箱和拆箱 目錄 性能 裝箱 拆箱 介紹 裝箱是將值類型轉換為 object 類型或由此值類型實現的任何介面類型的一個過程。 當 CLR 對值類型進行裝箱時,會將該值包裝到 System.Object 內部,再將後者存儲在托管堆上。 拆箱將從對象中提取值類型。 裝箱是隱式的;拆箱是顯式的。 裝箱和拆 ...
  • 異常介紹 C# 語言的異常處理功能可幫助您處理程式運行時出現的任何意外或異常情況。 異常處理使用 try、catch 和 finally 關鍵字嘗試某些操作,以處理失敗情況,儘管這些操作有可能失敗,但如果您確定需要這樣做,且希望在事後清理資源,就可以嘗試這樣做。 公共語言運行時 (CLR)、.NET ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...