在程序中,容易出现异常的程序如果没有异常处理方式,可能会导致程序的奔溃。这就需要我对可能发生异常的程序段,添加一个异常处理的方法。
异常处理的方式: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数据库的相关异常类