C#编程(八十一)---------- 捕获异常
捕獲異常
前面主要說了關于異常的一些基礎和理論知識,沒有進入到正真的異常案例,這一講通過幾個案例來描述一下異常的捕獲和處理.
案例代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
?
namespace 異常處理
{
??? class Program
??? {
??????? int result;
??????? Program()
??????? {
??????????? result = 0;
??????? }
??????? public void DisPlay(int a, int b)
??????? {
??????????? try//這個話可能有問題
??????????? {
??????????????? result = a / b;
??????????? }
??????????? catch (DivideByZeroException e) //不知道這個異常代表什么自己去查,有過那句話真的有問題,我就得治它
??????????? {
??????????????? Console.WriteLine("Exception caught: {0}", e);
??????????? }
??????????? finally//不管如何,下面這句話我必須得輸出
??????????? {
??????????????? Console.WriteLine("Result: {0}", result);
??????????? }
??????? }
??????? static void Main(string[] args)
??????? {
??????????? Program p = new Program();
??????????? p.DisPlay(25, 0);
??????????? Console.ReadKey();
??????? }
??? }
}
?
別和我說你看不懂,唯一看不懂得地方就是哪一點try-catch語句的地方,我都注釋好了(你試試沒有try-catch語句會咋樣?===>如果沒有try,程序會終止)
?
?
簡單說點其他小內容:
try ... catch 的目的是解決程序在出現錯誤時無法繼續執行下去的問題。
try不一定只能和catch 配對,也可以try{}finally{}這樣的形式,這不是沒有意義,因為這樣可以保證即使發生了異常,finally里面的代碼一定會被執行。有時候,這個還是非常有用的。 比如可以用來釋放一些自己占用的資源,然后讓調用者處理異常。
?
?
對異常的捕獲由三個部分組成:
?
try { //執行的代碼,其中可能有異常。一旦發現異常,則立即跳到catch執行。否則不會執行catch里面的內容 } catch { //除非try里面執行代碼發生了異常,否則這里的代碼不會執行 } finally { //不管什么情況都會執行,包括try catch 里面用了return ,可以理解為只要執行了try或者catch,就一定會執行 finally }
?
?
?
Try語句
Catch語句
Finally語句
try -- 意思是 “試一試” catch --? 意思是 “抓”,抓一抓。 沒有錯,就抓不到錯。有錯才能抓到并處理。
?
一個try可以跟任意個catch(個數沒有限制),主要是看有多少個異常類型,包括自定義的,Eeception是個類, 申明一個ex的Eeception對象,這個ex里面包含了當前發生在捕捉到的try塊的所有異常信息,如ex.Message最常用的 (try塊的詳細異常信息),
ex的位置:只能在cath塊 (異常處理塊) ex的作用:保存著系統捕獲的異常; 為什么要用ex:? 因為你不是神,并不能預測到你的程序會出什么錯,所以就用 MessageBox.Show(ex.Message);讓系統提示你程序錯在哪里,就可以順藤摸瓜,逮到錯誤源從而解決他!
如果catch語句捕獲了try語句不可能拋出的異常時,代碼將不能通過,如果catch語句中使用如下方式:catch( Exception? e ){ }將在任何情況下,編譯都能通過。
?
?try{??? DataConnection.Open();??? DataCommand.ExecuteReader();??? ...??? return;}finally{??? DataConnection.Close();}
無論是否拋出異常,也無論在catch 中從什么地方return返回,finally語句塊總是會執行,這樣你有機會調用Close來關閉數據庫連接(即使未打開或打開失敗,關閉操作永遠是可以執行的),以便于釋放已經產生的連接,釋放資源。 另外說明,return是可以放在try語句塊中的。但不管在什么時機返回,在返回前,finally將會執行。
?
?
throw(不止throws)的作用是當代碼執行到此處時認為的讓程序出錯,出錯原因是你指定的內容 catch的作用是try包含的內容運行出錯時,catch撲捉到try里面出錯的原因,至于對于這個錯誤你怎么操作就放在catch里,你可以把錯誤寫日志,messagebox輸出等等
備注:throw是語句,拋出一個異常 ; throws是方法拋出一個異常;
throw語法: throw <異常對象>
(C#中是沒有throws的,Java里有!別搞錯了)throws語法 : [修飾符] <返回值類型> <方法名>([參數列表]) [throws <異常類>]
其中:異常類可以聲明多個,用逗號分隔.
上面的那個案例,你試試經catch語句里的內容換成以下內容?
throw e;(應該會程序終止)
也可以換成這樣:
throw new Exception("出錯啦!", e);//這個時候也會終止程序,你注意看終止信息!!!
注意在捕獲并拋出異常時應使用 throw new Exception("出錯啦!", ex); 方式,則可獲得異常的具體位置。
當在VS調試或者DEBUG模式下運行程序成都可獲得異常發生的具體位置。
但當在獨立運行的RELEASE模式下時,異常只會記錄最初的調用位置。
當執行目錄不包含 *.pdb 文件時,異常信息中不會包含代碼及行號信息。
?
最后以一個案例結束異常捕獲的部分:
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? string userInput;
??????????? while (true)
??????????? {
??????????????? try
??????????????? {
??????????????????? Console.WriteLine("請輸入0到5之間的任意一個數字: ");
??????????????????? userInput = Console.ReadLine();
??????????????????? if (userInput == "")
??????????????????? {
??????????????????????? //當用戶輸入""時,跳出try和while但是仍然執行finally
??????????????????????? break;
??????????????????? }
??????????????????? int index = Convert.ToInt32(userInput);
??????????????????? if (index < 0 || index > 5)
??????????????????? {
??????????????????????? //拋出異常
??????????????????????? //可使用System.Exception類,但是該類是個基本類,,沒有包含特定錯誤信息
??????????????????????? //此處可用派生類IndexOutRangeException
??????????????????????? throw new IndexOutOfRangeException("請你看看要求好不好,你輸入的是: " + userInput);
??????????????????? }
??????????????????? Console.WriteLine("你輸入了:" + index);
??????????????? }
??????????????? //傳遞給catch塊的參數只能用于該catch塊,因此后續catch塊仍然可用同名參數ex
??????????????? catch (IndexOutOfRangeException ex)
??????????????? {
??????????????????? Console.WriteLine("異常了: " + ex.Message);
??????????????? }
??????????????? /*
???????????????? * 如果沒有前面catch塊中捕獲的異常類,這個也能處理IndexOutOfRangeException
???????????????? * 計算機只執行它在catchh塊列表中找到的第一個合適的catch塊
???????????????? * 基類的一個引用可一直想派生于他的所有類實例
???????????????? * 因此,最上面的catch塊應用于最特殊的異常情況,最后的是一般的catch塊
???????????????? *
???????????????? */
??????????????? catch (Exception ex)
??????????????? {
??????????????????? Console.WriteLine("拋出異常: " + ex.Message);
??????????????? }
??????????????? /*
???????????????? * 最一般的catch塊(不帶參數),用于處理其他沒用C#編寫的代碼拋出的異常
???????????????? * C#中只有派生于System.Exception類的實例才能作為一場拋出,其他語言沒這個限制
???????????????? * 此catch塊同樣捕獲全部異常,只是不知異常的詳細信息
???????????????? */
??????????????? catch
??????????????? {
??????????????????? //因為我們不知道這個異常表示什么類
??????????????????? Console.WriteLine("不知道什么異常,你自己猜去把.");
??????????????? }
??????????????? //無論執行try,catch最后都執行finally塊
??????????????? finally
??????????????? {
??????????????????? Console.WriteLine("不管咋樣,我都得執行,哥就是牛X");
??????????????? }
??????????????? /* 沒有處理異常時發生的情況
??????????????? * 生成一個異常后,代碼中沒有catch塊能處理這異常,由.NET運行庫捕獲
??????????????? * .NET運行庫把整個程序放在另一個更大的try塊中,用一個catch處理捕獲所有異常
??????????????? */
??????????? }
??????? }
}
?
注意:一般編寫一個可執行程序,硬不貨異常,編寫一個庫,最好不要補貨,要家丁調用代碼可以處理.
轉載于:https://www.cnblogs.com/FinleyJiang/p/7606470.html
總結
以上是生活随笔為你收集整理的C#编程(八十一)---------- 捕获异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python---字符串
- 下一篇: C#基础整理(一)