在程序中,容易出現異常的程序如果沒有異常處理方式,可能會導致程序的奔潰。這就需要我對可能發生異常的程序段,添加一個異常處理的方法。
異常處理的方式:1、即時處理:發現異常,即時處理異常,恢復程序的運行
2、拋出異常:捕獲異常之後,向上拋出異常(throw)
常用兩種形式:try ....catch....(finally)
自定義異常 throw。自定義異常沒有引發CLR異常,而是通過ApplicationException派生出來的異常。
1.try....catch....finally(捕獲和處理異常)
try{ 可能發生異常的代碼}
catch{異常處理的方式} 可以有多個catch,表示多路捕獲,但是一定要加入Exception這個異常捕獲。
public static int Update(string sql)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(sql, conn);
try
{
conn.Open();
return cmd.ExecuteNonQuery();
}
catch (SqlException ex ex)
{
//將異常信息保存在日誌中(略)...
throw ex;
}
catch (Exception ex)
{
//將異常信息保存在日誌中(略)...
throw ex;
}
finally
{
conn.Close();
}
}
finally在程序的運行中沒有表明一定要加上,只是加上finally,finally的內容一定會被執行到。
public int Update(string sql, SqlParameter[] param = null)
{
SqlConnection conn = new SqlConnection(connString);
SqlCommand com = new SqlCommand(sql, conn);
if (param != null)
{
com.Parameters.AddRange(param);//添加SQL語句參數
}
//可能出現異常的代碼
try
{
conn.Open();
return com.ExecuteNonQuery();
}
//發生異常時的處理
catch (Exception ex)
{
//可以在這個地方捕獲ex對象相關信息,然後保存到日誌文件中...
LogHelper.WriteLine("執行 public static int Update(string sql時發生異常)" + ex.Message);
//throw new Exception("執行 public static int Update(string sql時發生異常)" + ex.Message);
return -1;
}
finally
{
conn.Close();//在數據庫操作中,無論是否發生異常,最後都必須關閉連接。
}
}
2.自定義異常
自定義異常的封裝: throw new Exception("輸入的數值必須大於10");
自定義異常沒有引發CLR異常,而是通過ApplicationException派生出來的異常。因此自定義異常要慎用,否則可能會導致程序異常奔潰
private void InputNum(int num)
{
if (num < 10)
throw new Exception("輸入的數值必須大於10");
else if (num < 100)
throw new Exception("輸入的數值必須小於100");
else
{
//其他驗證
}
}
3.異常上拋 底層調用者=》中層調用者=》...=》頂層調用者
4.常見的異常類
ArgumentException:用於處理無效參數的異常類
FormatException:用於處理參數格式錯誤的類
IoException:與文件操作相關的類
OverFlowException:內存溢出的相關類
SqlException:sql server數據庫的相關異常類