.NET的異常處理機制用來發現、處理運行時錯誤。如果開發人員沒有提供異常的處理機制,就默認采用.NET的機制。
通常使用try...catch...finally捕獲異常。
try{//有可能發生異常}catch(Exception ex){//處理異常}finally{//清理}
○ 如果沒有異常發生,就直接到finally語句塊中。
○ finally語句塊是必須執行的
○ 這裡的catch和finally語句塊是可選的。try語句塊後面可以跟1個或多個catch語句塊,try語句塊後面可以直接跟finally語句塊。
○ Exception是所有異常的基類
□ 使用.NET默認異常處理機制捕獲異常
class Program{static void Main(string[] args){int a = 0;int result = 100/a;Console.WriteLine(result);Console.ReadKey();}}
□ 使用try...catch手動捕獲異常
class Program{static void Main(string[] args){int a = 0;int result = 0;try{result = 100/a;Console.WriteLine("這裡不會執行");}catch (DivideByZeroException exception){Console.WriteLine("出現異常");}Console.WriteLine(result);Console.ReadKey();}}
□ 使用try...catch...finally手動捕獲異常
class Program{static void Main(string[] args){int a = 0;int result = 0;try{result = 100/a;Console.WriteLine("這裡不會執行");}catch (DivideByZeroException exception){Console.WriteLine("出現異常");}finally{Console.WriteLine("放行吧,肯定會執行到我這裡的~~");}Console.WriteLine(result);Console.ReadKey();}}
可見,finally語句塊中的內容一定會被執行。
□ 使用try...多個catch...finally手動捕獲異常
class Program{static void Main(string[] args){int a = 0;int result = 0;try{result = 100/a;Console.WriteLine("這裡不會執行");}catch (DivideByZeroException exception){Console.WriteLine("不能被0除的異常");}catch (Exception ex){Console.WriteLine("異常");}finally{Console.WriteLine("放行吧,肯定會執行到我這裡的~~");}Console.WriteLine(result);Console.ReadKey();}}
可見,只要有一個catch語句塊捕獲到異常,其它catch語句塊不執行。
□ 使用try...catch(不帶括號,不帶參數)手動捕獲異常
class Program{static void Main(string[] args){int a = 0;int result = 0;try{result = 100/a;Console.WriteLine("這裡不會執行");}catch{Console.WriteLine("異常");}Console.WriteLine(result);Console.ReadKey();}}
通過以上方法,可以捕獲任何異常。
□ try...catch手動捕獲拋出的異常
class Program{static void Main(string[] args){try{throw new DivideByZeroException("除數不能為零");}catch (DivideByZeroException e){Console.WriteLine("異常");}Console.WriteLine("最後想說的");Console.ReadKey();}}
拋出異常本身並沒有顯示。
□ 較高層次上下文捕獲較低拋出的異常
class Program{static void Main(string[] args){Calculate c = new Calculate();try{c.Divide();}catch (Exception e){Console.WriteLine("捕獲異常");}Console.WriteLine("最後想說的");Console.ReadKey();}}public class Calculate{public void Divide(){try{int a = 0;int result = 100/a;}catch (DivideByZeroException e){throw;}}}
在Calculate內部拋出的異常,被更高層次的客戶端捕獲。
□ 自定義異常
class Program{static void Main(string[] args){try{throw new MyException("i am exception");}catch (Exception e){Console.WriteLine("捕獲到自定義異常了~~");}Console.WriteLine("最後想說的");Console.ReadKey();}}public class MyException : Exception{public MyException(string str){Console.WriteLine("這是我自定義的異常:" + str);}}
總結:
○ .NET異常處理並不是標准的try...catch...finally,可以是很靈活的。
○ 盡量在較低層次拋異常,在較高層次捕獲異常。
&是取址運算符,作用是提取一個變量的地址。
比如你定義了一個變量,那麼在編譯時,系統就會在內存中分配一個空間。
而這個空間在內存中的位置就是它的地址。&就提取它的地址。
e.g int a;在編譯時就給它分配一個地址,比如是2000;&a就是2000。
假如先定義了一個整型指針變量p,p=&a;就是把a的地址2000賦給p。運行後p=2000。
又如scanf("%d",&a);當你輸入3時,它會先根據&a知道a的地址,由地址找到a在內存中的空間,再把3寫入這個空間。
*是指針運算符,作用與&相反,它是根據變量的地址取出變量的值。
比如,*a的值就是變量a的值3。
下面是定義和聲明中用到指針的小結
int *p; 定義一個指向整型數據的指針。
int *p[n]; 定義指針數組p,它由n個指向整型數據的指針元素組成。
int (*p)[n]; p為指向含n個元素的一維數組的指針變量。
int *p(); p為返回一個指針的函數,該指針指向整型數據。
int (*p)(); p為指向函數的指針,該函數返回一個整型值
int **p; p是一個指針變量,它指向一個指向整型數據的指針變量。
如果你想系統的了解建議你可以看看譚浩強的《c程序設計》(第三版)這本書通俗易懂。是學習c語言不錯的教材。
&是取址運算符,作用是提取一個變量的地址。
比如你定義了一個變量,那麼在編譯時,系統就會在內存中分配一個空間。
而這個空間在內存中的位置就是它的地址。&就提取它的地址。
e.g int a;在編譯時就給它分配一個地址,比如是2000;&a就是2000。
假如先定義了一個整型指針變量p,p=&a;就是把a的地址2000賦給p。運行後p=2000。
又如scanf("%d",&a);當你輸入3時,它會先根據&a知道a的地址,由地址找到a在內存中的空間,再把3寫入這個空間。
*是指針運算符,作用與&相反,它是根據變量的地址取出變量的值。
比如,*a的值就是變量a的值3。
下面是定義和聲明中用到指針的小結
int *p; 定義一個指向整型數據的指針。
int *p[n]; 定義指針數組p,它由n個指向整型數據的指針元素組成。
int (*p)[n]; p為指向含n個元素的一維數組的指針變量。
int *p(); p為返回一個指針的函數,該指針指向整型數據。
int (*p)(); p為指向函數的指針,該函數返回一個整型值
int **p; p是一個指針變量,它指向一個指向整型數據的指針變量。
如果你想系統的了解建議你可以看看譚浩強的《c程序設計》(第三版)這本書通俗易懂。是學習c語言不錯的教材。