class Program
{
static void Main(string[] args)
{
string s = "abc";
int num = Convert.ToInt32(s);
Console.ReadKey();
}
}
這樣的代碼在VS編譯生成解決方案時完全不會報任何錯誤,但運行後可以看到發生了一個異常信息警告:其他信息: 輸入字符串的格式不正確。這就是一個異常信息。異常的概念、特點和注意事項:
1.異常發生在程序發生的不正常情況下。異常是以一個異常類對象的形式拋出,包括異常信息、發生的位置等。
2.異常的父類都是Exception類,異常類一般都繼承自Exception類。
3.異常可以人爲地拋出,方便程序員進行異常處理。拋出異常並不意味着可以放任不管,如果拋出異常應該首先想到如何去解決這個異常,讓代碼變正常。人爲拋出異常可以這麼做:
class Program
{
static void Main(string[] args)
{
string s = "abc";
if (s == "abc")
{
//在認爲可能出現異常的地方人爲拋出異常
throw new Exception("變量s的值包含了字母,並不能轉成int類型");
}
int num = Convert.ToInt32(s);
Console.ReadKey();
}
}
4.如果在出現異常時不想像上面代碼那樣讓程序停在中途,可以使用try-catch來處理異常信息。詳細代碼如下:class Program
{
static void Main(string[] args)
{
string s = "abc";
try
{
int num = Convert.ToInt32(s);
}
catch (Exception ex)
{
Console.WriteLine("變量s可能不是純數字,因此無法轉換,詳細錯誤信息:{0}", ex.Message);
}
Console.ReadKey();
}
}
在上面的代碼中,try結構內的代碼表示認爲可能會出現異常的代碼,catch結構則表示如果try結構內的代碼執行發生異常,將馬上跳轉到catch中執行代碼。也就是說try內的代碼只要出現異常,那麼try後面的代碼都不會執行,而是直接跳轉到catch裏執行代碼。這樣就算出現異常信息,也不會讓程序卡在中途,而是繼續執行完程序,並因爲Exception聲明的對象ex,可以在屏幕上輸出異常的詳細錯誤信息,這時候再對代碼進行bug檢查,修改並測試。5.可以在try-catch後面接上多個catch,可以獲取到其他類型的異常,因爲Exception類是所有異常類的父類。如果知道可能會發生什麼類型異常,就是用那個特定的異常類。
6.如果不知道如何處理異常,就不要輕易用try-catch。
7.還有個finally結構,總體是try-catch-finally,這樣執行try或catch後,最終都要執行finally中的代碼:
class Program
{
static void Main(string[] args)
{
string s = "abc";
try
{
int num = Convert.ToInt32(s);
}
catch (Exception ex)
{
Console.WriteLine("變量s可能不是純數字,因此無法轉換,詳細錯誤信息:{0}", ex.Message);
}
finally
{
Console.WriteLine("會被執行");
}
Console.ReadKey();
}
}
總結:通常來講,如果知道怎麼處理異常才使用try-catch這樣最好。如果只是catch住異常就那麼撒手不管,還不如不寫try-catch,老老實實根據異常信息修改代碼是更好的選擇。在常見的web應用開發中,經常有日誌記錄的習慣。比如用戶在執行對網站的一個操作時引發了一個異常,這時候用try-catch代碼抓住異常,在catch內將異常的詳細信息寫入日誌文件中,讓相關工作人員好有空去查看那些異常並進行改正。這可能纔是正確使用try-catch的姿勢。