錯誤和異常的總結
因為總結嗎,,可能概念啥的比較多,大家要學著適應.
首先是C#中的異常用老處理系統級和用戶級的錯誤狀態,是一種結構化,統一的類型安全的處理機制.
因為鄙人開始想走C++的道路,所以搞過一段時間的C++,感覺C#還是和C++的異常處理有點區別的.
1.在C#中,所有的異常必須由Exception派生的類類型的實例來表示.在C++中,可以使用任何類型的任何值表示異常.
2.在C#中,利用finally塊可編寫正常執行和異常情況下都將執行的終止代碼.在C++中,很難在不重復代碼的情況下編寫這樣的代碼.
3.C#中,系統級的異常如溢出啊,被零除無意義等都對應的定義預期匹配的異常類,並且與應用程序級的錯誤狀態處於同等地位.
(如果你不了解C++,,如果你不了解C++,沒關系,去學!學完了就會了)
導致異常的原因:(兩種情況可能導致異常)
第一種:throw語句用於利己無條件的引發一場.控制永遠不會執行throw後面的語句(如果你使用VS高點的版本,就會發現,如果再throw後面寫點東西就會報錯).
第二種:在執行C#語句和表達式的過程中,有時會出現一些例外情況,使某些操作無法完成,此時就會引發一些異常.例如,在整數觸發運算中,如果分母為0,則會引發一個異常(你自己編寫一個案例試試).
下面說一下所以的異常類的父類:Exception
Exception具有一些所有異常共享的值得注意的屬性:
Message屬性是string類型的一個只讀屬性,它包含關於所發生異常的原因的秒數(還記得,我在編寫自定義異常類的時候怎麼對待message嗎?).
InnerException屬性是Exception類型的一個只讀屬性.如果它的值不是null,則它所引用的是導致了當前一場的那個異常,即表示當前異常是在處理那個InnerException的catch塊中被引發的.否則,它的值為null,則表示該異常不是由另一個異常引發的.以這種方式連接在一起的異常對象的數目可以是任意的.
這兩個屬性的值可以在調用Exception的實例構造函數時指定.
異常的處理方式
首先,先介紹一個概念:異常傳播。當一個異常被拋出時,程序將控制權轉移給try語句中的第一個能處理該異常的catch語句。這種從異常拋出到轉移給合適的異常處理語句的過程就是異常傳播。
異常傳播包括重復執行以下步驟,直到找到一個與該異常相匹配的catch句子。
(1)由裡層到外層的執行每一個包圍拋出點的try語句
如果try包含一條或多條catch子句,那麼將按照這些子句出現的順序對它們逐一檢查以定位適合該異常的處理。所謂適合該異常的處理,就是第一個定義了該異常類型或者其基類型的catch子句,一般catch子句可以匹配任何類型的異常,一旦找到與該類型匹配的catch子句,異常傳播也就結束了,程序控制轉移到該catch子句執行。
如果當前的try塊包含finally塊的話,就執行finally塊,如果該快又拋出另外一個異常,則當前處理的異常將被終止,如果沒有,當finally塊執行完以後,再繼續異常的處理。
(2)如果當前的成員函數調用中沒能定位異常處理,則調用終止。
你能明白我想說啥嗎?
using System;
class ExceptionTestClass
{
public static void Main()
{
int x = 0;
try
{
int y = 100/x;
}
catch (ArithmeticException e)
{
Console.WriteLine(ArithmeticException Handler: {0}, e.ToString());
}
catch (Exception e)
{
Console.WriteLine(Generic Exception Handler: {0}, e.ToString());
}
}
}
這裡是一個try,與多個catch,異常出現後,try 將控制權轉移給catch,catch中有異常變量,它的類型是從Exception繼承過來的,這裡的程序中,catch (ArithmeticException e) 表示有計算溢出時調用這個異常。如果改成下面的,程序會報錯,
class ExceptionTestClass
{
public static void Main()
{
int x = 0;
try
{
int y = 100 / x;
}
catch (Exception e)
{
Console.WriteLine(Generic Exception Handler: {0}, e.ToString());
}
catch (ArithmeticException e)
{
Console.WriteLine(ArithmeticException Handler: {0}, e.ToString());
}
}
}
這是因為catch (Exception e)已經將catch (ArithmeticException e)包含在內了,前面不出錯,是因為ArithmeticException包含不了Exception。
以上就是我想表達的意思.
接下來就是C#中那些預定義的異常類:比如ArrayTypeMismatchException
個人認為C#的異常處理機制很厲害,上手快,但是想要深入以下就很難了,對於咱們初學者,先掌握幾個小例子就好了,以後再慢慢深入.