出错处理的一些思考
错误(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条出错”之类的信息给用户。
暂时先写这么多,其余以后边整理边补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律