注:本博文面向初学者。 前两天帮QQ群中的一个同窗远程解决一个问题,这个同窗听说本身折腾了一天都没搞定,给他结果之后感想很是多,今天有时间把这个问题以及背后隐藏的问题分享给你们。 下面说的吃异常的错误不只初学者会犯,不少工做不少年的人也常常会犯这种错误,所以虽然在不少人看起来很简单,我仍是在这里罗嗦了,但愿对有的人有帮助。 这位同窗说他写的程序老是报错说字段ParentId没找到,可是数据库中是有代码的。他是经过SQLHelper得到一个DataTable,而后把DataTable展现到ListView中进行数据展现的。示例性代码以下: DataSet ds = SQLHelper.ExecuteDataSet("select * from T_Persons"); listview1.DataSource = ds; listview1.FilterExpression = "ParentId=3"; 其实他的这个程序是有很大缺陷的,由于他是在UI层中进行数据过滤的,这个问题暂且不提。 主要问题是,T_Persons表中是有ParentId这个字段的,可是老是报异常“没有ParentId字段”。 一直让他很费解,所以我就猜想程序中有被吃掉的异常,所以我在VisualStudio中打开异常检测,打开主菜单→调试→异常,将Common Language Runtime Exception勾选上,这样就表示对于捕获的异常也Break,这样就能够发现被吃掉的异常了。 程序运行,果真在SQLHelper.ExecuteDataSet调用SqlConnection环节中看到异常抛出了,是“数据库链接失败”,示例性代码以下: DataSet ds = new DataSet(); try { SqlConnection conn = new SqlConnection(.........); //... adapter.Fill(ds); } catch { } return ds; 原来是他的链接字符串写错了。因为他想“耳根子清净”,就可耻的把异常给吃掉了,这样虽然数据库根本就没链接上,ExecuteDataSet方法仍然好像啥事都没发生同样假模假样的返回一个空的DataSet,因为这个DataSet什么表结构都没有,最后报异常“没有ParentId字段”也就不足为奇。 异常就是一种程序中没有预料到的问题,既然属于没有预料到的,就不该该不想看异常就把全部异常catch吃掉,原本ExecuteDataSet执行数据库操做已经失败了,后续的代码也就没有意义了,不该该继续执行了,应该让用户或者开发人员知道“这里出错了”,而不是继续掩耳盗铃的执行下去,不然很容易形成程序进入一个逻辑混乱的状态,出现各类奇怪的问题。 异常也就是意外,是没有预料到的状况,既然是意外,通常状况不须要开发人员去处理。异常了就异常了,没什么大不了的,异常了反而容易发现程序中的错误。对于有的状况确实须要catch异常的地方,只要不是处理后从新抛出,也最好将异常经过Log4Net等日志工具记录下来,方便开发人员排查问题。 有人说程序一旦出现异常多难看呀?“客户看到一堆异常的英文界面就发怒,仍是吃了好呀”,其实不要吃异常和不让用户看到“一堆异常的英文界面”并不冲突,好比在ASP.Net中就能够经过定制错误页的方式来解决,将错误页显示的模式设置为“RemoteOnly”,这样普通用户看的是定制后的没有“一堆异常的英文界面”的页面,而对于开发人员和系统管理员看到的则仍是异常页面,“两不耽误”! “不要吃异常”、“不要使用魔法数”、“资源最好用using进行管理”等这些很是常见的好的编程习惯是最容易被初学者忽略的,最终不遵照好习惯而自作自受的例子也家常便饭,建议你们要认真遵照这些基本的原则,最终受益的仍然是本身。 |