.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,可以是很靈活的。
○ 盡量在較低層次拋異常,在較高層次捕獲異常。