[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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...