只要是軟體,它就有可能存在一些問題,即使它看起來能正常的工作。 造成軟體異常的原因很多,如用戶的非法輸入,程式演算法錯誤造成的記憶體溢出,通信網路故障,程式的配置文件被破壞、刪除... .Net的異常處理 .Net平臺提供了一種標準技術(結構化異常處理[SEH])來發和捕獲運行時錯誤;結構化異常處理的優 ...
只要是軟體,它就有可能存在一些問題,即使它看起來能正常的工作。
造成軟體異常的原因很多,如用戶的非法輸入,程式演算法錯誤造成的記憶體溢出,通信網路故障,程式的配置文件被破壞、刪除...
.Net的異常處理
.Net平臺提供了一種標準技術(結構化異常處理[SEH])來發和捕獲運行時錯誤;結構化異常處理的優點在於,統一了開發人員對.NET領域內各語言都通用的方式來處理錯誤,並且提供了準確的問題描述和觸發異常時調用棧的詳細信息,此外還提供了問題處理的幫助鏈接。
System.Excption基類
System.Excption類的核心成員
捕獲異常
當調用一個可能引發異常的方法時,應當用try/catch塊;一旦捕獲到異常對象,通過異常對象就可以知道異常的相關信息。然後可以將異常的相關信息保存到日誌文件中,或者資料庫,或者通過郵件的方式發送到你的郵箱。
try代碼塊中執行的是可能發生異常的代碼,一旦發生異常,執行流就會直接進入到catch塊代碼中。如果沒有發生異常,代碼會直接忽略catch塊中的代碼。
try
{
File.ReadAllText("some.txt");
}
catch (Exception ex)
{
Console.WriteLine($"{ex.TargetSite}-{ex.Message}-{ex.StackTrace}-{ex.HelpLink}");
}
在VS中編寫代碼的時候,我們可以將滑鼠懸停在方法之上,這樣智能提示就能顯示出這個方法有可能觸發的異常類型
在try代碼塊中,有可能會發生多種類型的異常,我們可以通過多個catch塊分別去處理相應的異常。一般我們需要將要捕獲的特定異常放在前面,最後才是Exception類型
try
{
File.ReadAllText("exce.txt");
}
catch (ArgumentException e) { }
catch (IOException e) { }
catch (Exception e) { }
自定義異常類型
.NET基類庫定義了許多派生自System.Exception的類,如ArgumentException、StackOverflowException等等
.NET平臺引發的異常被稱為系統異常,這些異常是被認為不可修複的。系統異常都被派生自System.SystemException類型。定義系i同異常的目的是為了區分觸發異常的是.NET運行庫還是正在執行的應用程式代碼。
//其他代碼...
catch (StackOverflowException ex)
{
Console.WriteLine(ex is SystemException);//通過is關鍵字判斷是否是SystemException類型
}
正如上面所說,如果我們自定義異常類型,就應該派生自System.ApplicationException類型。
//一個標準的自定義異常類型應該繼承自ApplicationException或者Exception類型,並添加Serializable
[Serializable]
public class MyException : ApplicationException
{
public MyException()
{
}
public MyException(string message) : base(message)
{
}
public MyException(string message, Exception innerException) : base(message, innerException)
{
}
protected MyException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
//可以選擇重寫父類異常的屬性
public override string Message
{
get
{
return "這是一個MyException類型異常";
}
}
}
finally
finally代碼塊表示try/catch之後必須要執行的一段代碼。它不是在處理異常中必要的,一般用來處理資源釋放。
StreamReader reader = null;
try
{
reader = new StreamReader("");
}
catch (Exception e) { }
finally
{
reader.Close();
}
捕獲全局異常
Application.ThreadException += Application_ThreadException;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
結語
通過異常處理,我們可以使程式更加穩定,不至於程式莫寧奇妙的就掛掉