C#异常处理机制初步
原地址:http://www.sudu.cn/info/html/edu/net/20071227/50446.html
一、c#的異常處理所用到關鍵字?
try 用于檢查發生的異常,并幫助發送任何可能的異常。?
catch 以控制權更大的方式處理錯誤,可以有多個catch子句。?
finally 無論是否引發了異常,finally的代碼塊都將被執行。?
throw 用于引發異常,可引發預定義異常和自定義異常。?
二、c#異常處理的格式?
try?
{?
程序代碼塊;?
}?
catch(exception e)?
{?
異常處理代碼塊;?
}?
finally?
{?
無論是否發生異常,均要執行的代碼塊;?
}?
三、異常處理實戰?
一個除數和零的簡單例子:?
public class divisoriszero?
{?
private static void main()?
{?
int dividend=10;?
int divisor1=0;?
int divisor2=5;?
int dividevalue;?
try?
{?
dividevalue=dividend/divisor1; //(1)?
//dividevalue=dividend/divisor2; //(2)?
system.console.writeline("dividevalue={0}",dividevalue);//(3)這一行將不會被執行。?
}?
catch?
{?
system.console.writeline("傳遞過來的異常值為:{0}",e);?
}?
finally?
{?
system.console.writeline("無論是否發生異常,我都會顯示。");?
}?
}?
}?
注:(1)行被執行則會拋出一個異常,如果沒有catch語句,程序會異常終止,使用不帶參數的catch子句,則可以捕獲任意類型的異常。?
如果將(1)行注釋掉,啟用(2)行,這意味該程序運行時不會出現異常,從輸出可知,finally代碼塊仍將被執行。?
可以給try語句提供多個catch語句,以捕獲特定的異常,如上例中:0作為除數則會引發dividebyzeroexception類型的異常,上例中的catch語句可以作如下修改:?
catch(dividebyzeroexception e)?
{?
system.console.writeline("零不能作為除數!異常值為:\n{0}",e);?
}?
catch(exception e)?
{?
system.console.writeline("并非\零作為除數引發的異常\"!異常值為:\n{0}",e);?
}?
為什么還要加上一個catch(exception e)子句呢?原因很簡單,catch(dividebyzeroexception e)子句只能捕獲特定的異常,try內的程序代碼可能還會產生其它的異常,這些異常只能由catch(exception e)來捕獲了。?
下表給出了一些常見的異常:?
system名稱空間中常用的異常類?
異常類名稱 簡單描述?
memberaccessexception 訪問錯誤:類型成員不能被訪問?
argumentexception 參數錯誤:方法的參數無效?
argumentnullexception 參數為空:給方法傳遞一個不可接受的空參數?
arithmeticexception 數學計算錯誤:由于數學運算導致的異常,覆蓋面廣。?
arraytypemismatchexception 數組類型不匹配?
dividebyzeroexception 被零除?
formatexception 參數的格式不正確?
indexoutofrangeexception 索引超出范圍,小于0或比最后一個元素的索引還大?
invalidcastexception 非法強制轉換,在顯式轉換失敗時引發?
multicastnotsupportedexception 不支持的組播:組合兩個非空委派失敗時引發?
notsupportedexception 調用的方法在類中沒有實現?
nullreferenceexception 引用空引用對象時引發?
outofmemoryexception 無法為新語句分配內存時引發,內存不足?
overflowexception 溢出?
stackoverflowexception 棧溢出?
typeinitializationexception 錯誤的初始化類型:靜態構造函數有問題時引發?
notfinitenumberexception 無限大的值:數字不合法?
四、定義自己的異常類?
除了預定義的異常外,我們還可以創建自己的異常,過程比較簡單:?
㈠聲明一個異常,格式如下:?
class exceptionname:exception{}?
㈡引發自己的異常:?
throw(exceptionname);?
看一個例子:?
class iamsecondgrade:system.exception{}//聲明異常?
class secondgrade?
{?
public static int mul(int first,int second)?
{?
if(first>100||second>100)?
throw new iamsecondgrade();//引發異常?
return (first*second);?
}?
public static void main()?
{?
int mul_value;?
try?
{?
mul_value=mul(ArrayArray,56);?
system.console.writeline("ArrayArray與56積為:{0}",mul_value);?
mul_value=mul(101,4);?
system.console.writeline("出現異常,這行是不會被執行的。");?
}?
catch(iamsecondgrade)//捕獲自定義的異常?
{?
system.console.writeline("我才上二年級,超過100的乘法我不會。嘿嘿,我自定義的異常。");?
}?
catch(system.exception e)?
{?
system.console.writeline("非自定義異常。其值為:{0}",e);?
}?
}?
}?
?
轉載于:https://www.cnblogs.com/123ing/p/3789186.html
總結
以上是生活随笔為你收集整理的C#异常处理机制初步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EF实体框架数据操作基类(转)
- 下一篇: C#基础加强_泛型的基本原理