出错处理的一些思考

错误(error)和异常(exception)严格来说是不同的,两者的区别,网上不难找到分析的帖子。暂时不想研究这个问题,因此暂不作严格区分,只简单地称之为“出错处理”。

关于出错或者异常处理,已经有不少帖子和专著讨论了,下次有时间整理一下有代表性的几个,评论一下。

之所以还要写这方面的帖子,是觉得这些帖子和专著说的还不够全面,有补充的必要。

这个帖子很可能有后续,因为问题太多,一下子讨论不完。因为是边想边记,很多地方可能会不断修订。欢迎批评指正。

 

出错处理的目的或者说目标,我想主要是两条:一是为用户提供友好和准确的提示信息,二是为开发者提供调试错误的信息。

先说第1条。先说“友好”,如果不考虑这点,比如直接在界面上显示exception的堆栈信息,不够友好,另外可能有安全问题,比如暴露了程序文件的名称和位置等(主要是在web应用上)。

再说“准确”,固然,给用户的提示信息不必包括某些技术细节,比如登陆数据库的用户名等,但是不能误导用户,力求给用户准确的信息。比如,真正的原因是数据库连不上,提示信息只是简单地说程序错误或者打开页面出错,都不是好的做法。

再说第2条。这个将是重点要讨论的问题。先简要说几点。

1.一般情况下,不能吞exception。

这是指以下的做法:

try

{

     //做点什么

     ........

}

catch 

{

}

也就是说catch块里什么都没有。缺陷是显而易见的,出错信息没有记录下来,也没有显示出来,除非调试源程序,否则无法知道出过错,在哪里出过错。

但也有例外(好像网上的帖子很少提到这点),例外的情况下,常见的做法是在catch块里加一点注释,说明吞exception的理由。看到过log4net的代码里就有这样的做法。

常见的理由,现在想到的有

1).打错误日志的代码出exception(好像log4net里的代码正是这样的情况)

2).错误不影响大局,不必要处理,而保证应用不崩溃更为重要

 

2. 一般来说,出错信息越详细越好,特别是要把函数/方法的参数值记录到log里。

举两个例子。1)出错信息是:某字段转换时出错,数据将被截断

2) 将xml加载到datatable时出错,提示不合法

如果没有参数信息,很难找出出错的数据并修正。

实践中曾碰到一个case,开始打日志时,没有包括参数信息,结果揭示1)的错误,没法修正。后来修改了打日志的代码,包括了出错信息。第二次出同样错的时候,检查一下各个参数的值,两分钟就找到了出错的地方,在数据库里修正数据,马上就好了。

关于如何记录参数值,以后还会讨论。

 

3.循环中出错,要小心处理。for/while等循环结构里出错,要小心处理。很多情况下,不能简单地throw excpetion,较好的做法是:记录下出错信息,出错的记录信息(是循环里的哪一条记录出错,参数值如何),然后跳过这条记录,继续执行下一条记录,在全部循环结束时,如果有可能,显示类似“共处理N条记录,其中N条出错”之类的信息给用户。

 

暂时先写这么多,其余以后边整理边补充。

转载于:https://www.cnblogs.com/badnumber/p/8196784.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值