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