异常处理,究竟是处理什么

“系统中每行代码,都应该是有意义的,如果一段代码可有可无,那它就不应该存在。”

9175e3c390756747700d4bebf49d5d86.jpeg

01

内容简述

异常处理是软件开发的必备技能,但异常处理,究竟是处理什么?,很多小伙伴并没有一个清晰的认识,大部分人的认识停留在给代码加上try/catch就算是异常处理了,至于异常捕获之后该做什么,并不清楚。本文阐述一下自己对异常处理的思考,希望帮助大家对异常处理有一个清晰的认识,在面对异常处理时,能够有准确的决策。

02


区分异常和错误

首先要区分哪些是异常,哪些是错误。

可以预测,可以通过代码逻辑避免发生的异常,我称之为“错误”。

无法预测,无法通过代码逻辑避免的异常,我称之为“异常”。

相信到这里,很多小伙伴心里已经有答案了,比如,平时遇到最多的——空引用异常,应该算是错误,这是可以通过代码逻辑避免的。而真正的异常是无法预料的,比如:网络中断、请求超时、堆栈溢出、第三方服务异常…等。

我们区分了异常和错误,那么对于属于错误的部分,最佳的处理方案是通过代码逻辑,尽量控制,避免错误的发生,而对于属于异常的部分,或者遗漏的,没有控制的错误,该如何处理?接下来便是本文的重点。

03


异常处理要做什么

异常处理概括起来要做三件事:

1.记录异常日志

记录异常日志是为了后续排查,定位,解决异常问题,需要记录的信息包括:

异常发生时间,异常代码位置,以及异常时上下文信息(参数),当前操作人等;

如果是Web请求,还要记录请求的IP地址,URL,客户端设备信息;

如果是SOA或微服务架构,还要记录调用链路标识TraceID。

记录异常信息的原则是:帮助开发人员还原异常现场,快速定位异常原因,以便尽快修复。

2.确保非托管资源的关闭和释放

包括:数据库链接,IO流,等非托管资源的处理,在发生异常的情况下,如何正确关闭链接,释放资源,是需要重点考虑的。

推荐使用 using 语句声明非托管资源,而不是用try/catch,可以查看我之前的文章 C# using()的本质

3.处理异常后续业务逻辑

主要是业务处理逻辑中事先规划的异常发生后的处理逻辑,比如:

某个服务接口请求超时后进行重试;

某个功能操作失败后,切换到备选方案(降级)或触发补偿事件;

在多线程中,当某个子线程异常之后,取消其他相关子线程操作;

自定义异常的处理。

上述情况要根据实际的业务场景决定,如果系统设计时并没有规划,也就不需求去处理这部分功能。

04


处理方案

明确了异常处理的三件事,接着看具体方案。

第一件事:记录异常日志

毫无疑问,应该由全局异常处理组件记录异常日志,如果框架有全局异常处理功能,就使用框架提供的异常处理功能,如果框架没有,那就自己开发一个。在Asp.Net中,可以使用ExceptionFilter或自定义中间件实现全局异常处理

第二件事:确保非托管资源关闭和释放

由上文所说,使用using就好。

第三件事:处理异常后续业务逻辑

视实际业务场景而定,可以在代码中加try/catch,也可以开发通用的异常处理组件,让业务逻辑更简洁清晰。

05


总结

异常处理规范建议:

  1. 通过代码规范,尽量减少系统中可控的异常(错误)发生。

  2. 通过全局异常组件,记录异常日志,处理通用异常。

  3. 仅在业务逻辑明确需求的情况下,使用try/catch处理异常。

06


成长轨迹

有小伙伴,习惯在每个方法中都加try/catch,却说不清为何这么做,大概的理由是:程序总难免会报错,所以要进行try/catch。根本原因在于:对代码运行机制不够理解,对自己的代码没有信心,以及对异常处理认识的模糊。这些try/catch是不应该出现的,会对代码简洁性,可读性造成污染,与优雅代码背道而驰。我自己也是从这个阶段过来的,也希望小伙伴们不要一直停留在这个阶段。

我第一次对异常处理有深刻认知是得到了一位微软首席架构师的指点,这位架构师是沈征,一位大师级的技术专家,既能讲理论,画架构图,又能写出优雅的框架代码,是我多年职业生涯中遇到的为数不多的大师,他的几句话足以让人在迷雾之中看清前方的路,看见远方的山,看到头顶的太阳和蓝天,再次向大师致敬。

认为内容有价值的话可以点赞,转发,关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十一篇:(顺序)容器的好伴侣 --- 容器适配器

前言 vector容器的数据结构原型是顺序表,它很好的实现了顺序表的功能,大大方便了编程。好了,现在假设有天我又想用栈,那么有没有栈对应的容器呢?很遗憾,木有。但基于“栈”可以由顺序表或者链表实现这一特性…

第一季度ADC市场份额揭榜 A10 Networks再获用户青睐

近日,根据全球知名咨询公司IDC 发布的2018年第一季度中国ADC市场分析报告显示,A10 Networks 稳占中国ADC市场份额第二名。数据来源:IDC 2018年Q1 ADC市场报告 从厂商排名来看依次为 F5 30%, A10Networks 12%, DPtech 12% ,Sangfor 9% &#…

利用linux shell自己主动顶贴

在论坛上面发帖问个什么东西的话,一旦不顶。帖子就秒沉了,可是又实在不想每时每刻都去顶,怎么办?以下展示了怎样利用shell 的crontab实现自己主动顶贴。 闲话不多说了,以豆瓣为例—– 1: 用chrome打开豆瓣…

深度学习库 SynapseML for .NET 发布0.1 版本

2021年11月 微软开源一款简单的、多语言的、大规模并行的机器学习库 SynapseML(以前称为 MMLSpark),以帮助开发人员简化机器学习管道的创建。具体参见[1]微软深度学习库 SynapseML:可直接在系统中嵌入 45 种不同机器学习服务、支持…

支持回调处理 php函数,PHP支持回调的函数有哪些?

PHP支持回调的函数有:1、匿名函数,代码为【$server->on Request】;2、类静态方法,代码为【static function test $req】;3、函数,代码为【my_onRequest $req】。PHP支持回调的函数有:1、匿名…

病毒木马查杀实战第019篇:病毒特征码查杀之编程实现

前言上次我们已经简介过了病毒特征码提取的基本方法,那么这次我们就通过编程来实现对于病毒的特征码查杀。定义特征码存储结构为了简单起见。这次我们使用的是setup.exe以及unpacked.exe这两个病毒样本。经过上次的分析,我们对setup.exe样本的特征码提取…

《ASP.NET Core 6框架揭秘》实例演示[22]:如何承载你的后台服务[补充]

借助 .NET提供的服务承载(Hosting)系统,我们可以将一个或者多个长时间运行的后台服务寄宿或者承载我们创建的应用中。任何需要在后台长时间运行的操作都可以定义成标准化的服务并利用该系统来承载,ASP.NET Core应用最终也体现为这…

ASP.NET Core MVC压缩样式、脚本及总是复制文件到输出目录

前言 在.NET Core之前对于压缩样式文件和脚本我们可能需要借助第三方工具来进行压缩,但在ASP.NET MVC Core中则无需借助第三方工具来完成,本节我们来看看ASP.NET Core MVC为我们提供了哪些方便。 自动压缩样式和脚本 当我们在测试环境中肯定不需要压缩脚…

京东订单自动评价方法

刚刚完成的一个京东自动订单脚本, 以后还要加入其它京东自动的脚本项目地址: https://github.com/mm333444/aox_jd_auto_script 京东自动完成脚本 目前只完成京东订单自动评价, 评价时会自动上传商品图片 一、安装 1. 程序依赖 python3.52. 安装配置 安装pipenv安装模块 pipenv…

宜建立自主可控的车用芯片和操作系统技术体系

万物互联时代,操作系统的边界在不断突破,面向“人机物”融合的泛在计算场景,能够支撑分布式人机物协同应用的操作系统将是产业未来之光。操作系统在经过主机时代、PC互联时代、移动互联时代之后,来到万物互联时代,这恰…

django 用户管理(1)

编辑了前端的页面展示,用的bootstrap 用户登录 用户信息 用户编辑 创建用户 修改密码 转载于:https://blog.51cto.com/jacksoner/2133129

qiaoye.php,全自动无限生成关键词页面(黑帽SEO优化终极方法)

如果你是做黑帽SEO的,如果你还停留在用栏目、租域名、劫持等手段来做黑帽SEO优化,我可以肯定的告诉你,你做的再好,也赚不了多少。那么今天咱们要说的就是无限生成关键词页面用内容页来做黑帽SEO优化。这是我在演示的时候做的一个站…

v1.0.25 新版发布及Smart Meetup重新开启丨SmartIDE

作者:徐磊文章首发地址:https://smartide.cn/zh/blog/2022-0892-sprint25/关于SmartIDESmartIDE是一群开发者为所有开发者开发的开源云原生IDE,我们的使命是“为开发者赋予云原生的超能力”!使用SmartIDE你只需要学会一个简单的指…

vue实现首屏加载等待动画 避免首次加载白屏尴尬

为什么80%的码农都做不了架构师?>>> 0 直接上效果图 1背景,用户体验良好一直是个重要的问题。 2怎么加到自己项目里面? 复制css html代码到自己的index.html即可 代码链接 源码地址 Vue学习前端群493671066,美女多多。…

java-回调机制详解

转:http://blog.csdn.net/llayjun/article/details/50454148 阅读目录 一、前言二、回调的含义和用途三、Java实现接口回调 四、Android中的接口回调五、参考资料一、前言 最近在看android fragment与Activity进行数据传递的部分,看到了接口回调的内容&a…

lfi读取php,php LFI读php文件源码以及直接post webshell

php LFI读php文件源码以及间接post 网站shell假如如下一个场景(1) http://vulnerable/fileincl/example1.php?pageintro.php(该php文件包孕LFI漏洞)(2) 然而你不有中央能够upload你的网站shell代码(三) LFI只能读取到非php文件的源码(由于无…

根据请求上下文动态设置静态文件存储目录

前言上次,我们实现了根据 subpath 特定格式《动态设置静态文件存储目录》。例如:subpath静态文件路径/userAId/1.jpgc:\abc\userAId\1.jpg/userBId/1.jpgd:\xyz\123\userBId\1.jpg但是,如果 subpath 不能有这种特定格式,只能用通用…

ImageView的scaleType理解

2019独角兽企业重金招聘Python工程师标准>>> 1.android:scaleType“center” 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size时,多出来的部分被截掉。 2.android:scaleType“center_inside” 以原图正常显示为目的&…

第一章 引论

1、什么是多道程序设计? 即内存中同时运行多道独立程序,宏观上所有程序同时运行,微观上程序串行,多道程序轮流占用CPU,提高了资源利用率。 2、什么是SPOOLING?读者是否认为将来的高级个人计算机会把SPOOLIN…

《ASP.NET Core 6框架揭秘》实例演示[24]:中间件的多种定义方式

ASP.NET Core的请求处理管道由一个服务器和一组中间件组成&#xff0c;位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应&#xff0c;针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托&#xff0c;但…