我们的程序不知道会什么时候会出现问题,我们要对程序做一些处理,即使出错了也要给用户一个比较友好的提示,不能把错误抛给用户。异常处理就是在你认为有可能出问题的地方对问题进行事先处理。
比如我们打开数据库的时候,有可能是因为网络原因打不开,打开文件失败,等等,这些都是可能发生的。在可能发生错误的地方,进行处理这个主要靠 try catch 的语法来进行。try就是尝试做什么,catch就是要捕获可能发生的错误 如果try语句中没有错误的话,就不会执行catch ,如果有错就可以在catch中进行处理了,但这个带来一个新的问题 ,我们捕获异常后,如果只提示这个,这个错误实际的原因就找不到了 ,对于我们自己排查错误就有点麻烦了 ,所以我们给用户看的是友好的提示 ,我们自己还要留下原先的错误信息,方便排查错误 ,这就要用到日志功能了 。我们要把程序真正的错误信息写到日志里去 ,try还有一个语句块 ,叫finnaly 这个主要是为了保证你有机会做一些后续的处理。
try
{
con = new SqlConnection();
con.ConnectionString = @"packet size=4096;user id=sa;Connection Timeout=150;Max Pool size=1500;data source=a ;persist security info=True;initial catalog=a;password=a";
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.CommandText = string.Format("select ..{0}.{1}.'",a,b);
cmd.Connection = con;
count = cmd.ExecuteScalar();
}
catch (Exception ee) //Excetion 这个类是C#提供的异常类,先知道就可以了,后面我们讲继承的时候就会知道它是所有异常类的基类。
{
string message = ee.Message;//这个就是真的错误信息。
//异常对象中有3个重要的属性
//ee.Message;这个是错误信息
//ee.StackTrace;这个是错误的堆栈,可以看出是那个语句错了
//ee.InnerException;这个是看它是否有内部异常,后续再看这个问题吧。
//写日志,我们一般是要写到一个日志文件中,这个需要操作文件,后续我们再说把,比如有一个LogHelper的类
//LogHelper.Write(ee.Message); 类似这样就可以了,出了问题就看日志。
MessageBox.Show("连接数据库出错了,请进行检查!");
return;
}
finally//最后不管是否发生异常,该一句一定会执行的
{
//如果数据库连接是打开的在这里关闭,避免连接泄露。连接泄露这个后面给你讲,你就知道数据库连接是很宝贵的资源,用完必须关闭。否则你的程序就会很慢。
if (con.State == ConnectionState.Open)
{
con.Close();
}
MessageBox.Show("一定会执行的");
}