关于系统异常设计的再思考

一篇文章带你了解监控告警设计 “哎哎,XX,很多客服反馈这个业务挂了怎么回事,赶紧看看。” 正在安安静静写代码的你心头一颤,出问题了。赶紧打开业务链接看看,真出问题了,怎么办,怎么查问题?一脸闷逼。 据说现代医学始于听诊器的发明,医生凭借该物收集放大从各个器官发出的声音以诊断问题。 我一直喜欢把我们做后台做业务的,称之为在快速飞行的飞机上修零件。边飞边升级。。在飞机上有各种各样的仪表盘指示着各个模块的运行情况。如果没有这些... 阅读详情

 

关于系统异常设计的再思考

1.是否需要已检测异常

《Clean Code》一书对已检测异常是持完全否定态度的。事实上,有很多人是不认可已检测异常的,一方面,在目前的主流语言中,只有java提供了已检测异常机制,那么这从反面证明已检测异常并不是一种“必须”或者说是“优秀”的语言机制。已检测异常的设计初衷是希望借助编译期的检查来强制异常处理,从而有助于构建出健壮的系统。但正如《Clean Code》一书所说,那些没有已检测异常的语言就不能构建健壮的系统么?显然不是,也就是说已检测异常并不是"看上去那么美"。另一方面,人们普遍认为引入已检测异常的一个很大的代价就是违反了开闭原则。一旦底层的某个方法需要修改接口抛出一个已检测异常,那么上层的所有调用接口都不能幸免,它们的接口或是实现也必然需要做出改动!再比如:一个较“底层”的方法抛出已检测异常,如果上层方法对此异常也“无能为力”的话会怎样呢?捕获而不处理是肯定不正确的。而如果再抛出就需要有一个合适的异常来包裹一下以便符合当前方法的抽象级别。

2.对于一个异常应该根据什么原则来确定它应该是已检测异常还是未检查异常?

实际上,如果在回答第一个问题时,我们选择了不使用已检测异常的话,也就不存在这个问题了。但是在广泛使用已检测异常的系统里,知道怎样区分已检测异常和未检测异常是非常必要的。一般来说:从调用者的角度去看,已检测异常是那些完全有理由能“预见”或是“重现”的异常情况。那这也正意未着方法本身明确要求调用者不能忽视(既然它已经预见到可能会发生了)这些异常情况。基于这样的准则,我们说:几乎所有的业务异常(有深刻业务含义的异常)都应该是已检测异常。除此之外都应该属于程序性错误,也就是未检测异常。
这看起来很简单,但是却忽略了一个问题:抽象级别的问题。现在的系统都是依赖各种框架或组件构建起来的。在框架和组件级别,一些“当然”业务上的已检测异常,在上层看来是很“底层”的“技术”问题。比如,在一个文件处理框架里,FileNotFoundException是一个很自然的“业务”异常,因而是一个已检测异常。但是对于调用者来说,如果对此异常也“无能为力”会怎样呢?捕获而不处理是肯定不正确的。而如果再抛出就需要有一个合适的异常来包裹一下以便符合当前方法的抽象级别。这样看,处理已检测异常确实是很“劳神”的(当然你可以说这正是它的优点)。

3.视图层的异常统一处理方法

当异常一直浮升到视图层时,就需要考虑以何种方式通知用户系统出现了问题。当发生异常时跳转到统一的异常处理页面显示错误信息是一种普遍的做法。至于说在当前页面弹出对话框显示异常的形式可能会更加友好一些。但是由于页面请求既有http请求又有ajax请求的话,弹出对话框的方式可能有些技术上的困难。 

 

如何优雅地设计异常 讲述了java在异常处理中的技巧和心得,以及在实践中的应用。 立即下载

相关推荐

AUTOSAR实战:手把手教你配置EthTsync模块,搞定车载以太网时间同步

本文详细解析AUTOSAR架构中EthTsync模块的配置方法,实现车载以太网时间同步。通过对比gPTP与PTP协议差异,提供从开发环境准备到参数配置、模块集成的全流程指南,并分享性能优化与调试技巧,帮助开发者实现微秒级同步精度,满足自动驾驶等高精度时间同步需求。

weixin_28736335的博客 375

java异常设计_java异常设计

异常的分类结构图异常机制是为了解决什么问题?它也是线程结束的一种方式,从某中角度来讲,它与正常return没有什么区别,只不过是一种异常的方式结束。那为什么需要这种异常的机制呢?异常机制本身也是划分了严重程度,如:Error/Exception. 它以一种不侵入正常流程编码的形式,尽量不让程序崩溃(Error类型的异常), 同时给开发者友好的提示信息(方便问题的定位)。各种异常在什么场景下出现?能...

weixin_33997566的博客 372

ROS2实战:从零部署Cartographer激光SLAM系统

本文详细介绍了在ROS2 Humble环境下,从零开始部署Cartographer激光SLAM系统的完整实战流程。内容涵盖环境准备、Cartographer安装(APT与源码编译两种方式对比)、工作空间与功能包创建、核心启动文件与Lua配置文件编写、系统构建与可视化启动,以及地图保存与实战调参技巧,帮助开发者快速构建稳定可靠的机器人SLAM应用。

weixin_29213655的博客 248

Java-异常机制详解以及开发时异常设计的原则要求

异常处理的合理性完整性体现了一门语言是否成熟。而Java作为目前最流行的开发语言之一,固然具有一个完善的异常处理机制。本文将对异常处理机制来一次大的总结,后面会讲解一些原则性问题、开发技巧以及经常遇到的异常。文章结构:1.异常机制树的讲解; 2.异常处理的五大关键字; 3.原则性问题以及开发使用异常技巧;4.异常链;5.Java的一些新特性;6.常见的异常类(这个查找多个文章总结)。

Jack__Frost的博客 6797

从零搭建Synopsys EDA环境:Ubuntu系统下的完整安装与避坑指南

本文详细介绍了在Ubuntu系统下从零搭建Synopsys EDA环境的完整流程,包括系统配置、安装文件准备、核心工具安装、License配置及常见问题排查。特别针对数字IC设计场景,提供了VCS、Verdi、Design Compiler等EDA Tools的安装避坑指南和性能优化建议,帮助开发者高效搭建稳定的开发环境。

weixin_33738982的博客 491

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4704

java异常处理设计

通过以上的描述和举例,可以总结出一个结论,**RuntimeException 异常和受检异常之间的区别就是: 是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常 (RuntimeException)。不要同时记录和抛出异常,因为异常会打印多次,正确的处理方式要么抛出异常要么记录异常,如果抛出异常,不要原封不动的抛出,可以自定义异常抛出。尽可能晚的捕获异常,如非必要,建议所有的异常都不要在下层捕获,而应该由最上层捕获并统一处理这些异常。

qq_35693377的博客 977

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 998

【异常设计】自定义异常体系,异常处理中心

在Java程序开发中,会遇到各种异常,常见的NullPonitException(NPE),IllegalArgumentException等等,Java的优雅之处,很大一部分就在于这些刚开始看着头痛的异常中 Exceptions 首先,什么是异常,通俗来讲,异常,是我们程序出现错误,并无法按照预期执行下去的情况,会抛出一个异常,它会告诉你,某个地方出错了,请示你该如何解决或者修改你的代码。 那么...

Summerdream1996的博客 1060

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

面试问题总结——关于OpenCV(一)

整理了一下网上和我面试中遇到的关于OpenCV相关的问题。 其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 关于OpenCV的内容 1.OpenCV中cv::Mat的深拷贝和浅拷贝问题   深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。   浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。 OpenCV的Mat时,有几种赋值方式分别为:   深.

boss-dog 1万+

Java 异常设计

一、Java 异常体系结构从上面异常继承树可以看出,所以异常都继承自Throwable,这也意味着所有异常都是可以抛出的。具体来说,广义的异常可以分为Error和Exception两大类。Error表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如:最常见的OOM(OutOfMemoryError)错误。对于Error我...

江城宴的博客 2414

将任意文件转换为Pcap网络数据包传输

一款实用的工具用于将任意文件转换为pcap网络数据包

村中少年的专栏 3188

系统异常模块设计思考

叨叨 周末闲来无事,一直觉得当前项目的异常模块的结构设计不合适,经常有人问:这个异常提示放在哪里合适? 这个异常和这个异常是一样的啊! 异常提示放的乱七八糟…来梳理下吧. 项目中通常是自定义一个异常类,并继承RuntimeException.通过提供构造方法来传入自定义异常信息.这种设计的结果就是代码中随处可见的throw new XXException("xxx");,相同的异常提示没法复用; 为了异常消息能复用(即字符串异常提示),定义一些接口类,将这些提示信息作为常量.当前项目就是这样做的.不知道什

罗曼蒂克在消亡 631

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

关于“错误码”设计方面的思考|系统异常,我****

这篇文章给大家分享一下关于“错误码”设计方面的思考。其实提到“错误码”我的第一反映是:混乱。 特别是在微服务架构之下,各个团队都有一套自己的“错误码”,甚至在一个团队里面不同的微服务都有自己的一套码值,这些“一套一套”的错误码,各成一派,互不通气。 但是一旦微服务上下游交互涉及到错误码转换的时候,总有一方就开始痛了,因为总有一方要承担兼容转换、令人“恶心”的逻辑。 我也见过试图在一片混乱中“力挽狂澜”的案例,比如由基础架构组提供统一的错误码管理平台,如果某个系统需要错误码就去该管理平台上去申请。 这个想法固

bjmsb79的博客 447

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

XX系统功能用例整体设计思路

进入新的部门,首先面临的是熟悉业务以及如何设计用例,如果是新人的话,因为可能会涉及到思考的角度比较多会遇到不知道如何下手开始写用例的情况,鉴于一些经验总结,可以在写用例的时候整体设计参考如下: 系统切入点 目的:将大的功能模块切小的完整的功能模块,将不好把控的全局模块一部分一部分去吞掉。 思考的角度:从需求入手,以一个大的功能点或者流程线方式入手 方法:比如Web组件,一个登录或者一个注册

Jora_Zhang的博客 4376

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

网吧计费管理系统开发历程与源码分享(武汉理工大学程序设计综合实验课程设计)

首先,这门课虽然年代久远,但是实践性不容小觑。之前我以为编程就是枯燥无味的打几十行代码,但是通过这门课,我发现编程也可以更有趣!其次,这个计费管理系统不错哟!通过这个系统,我们可以实现添加卡,查询卡,激活卡,注销卡,挂失卡,上机,下机,退费,转账,展示卡信息,删除卡,查询统计营业额等功能!不过,这个系统设计还是遇到了很多困难。比如,最开始我就经常搞混了各个类之间的关系,导致程序运行出现各种奇怪的错误。还有就是在实现某些功能的时候,我想了很久也不知道该怎么写,只能靠不断尝试和调试来解决问题。

m0_69268893的博客 2949

《关于系统开发中的数据问题三点思考》

干了十多年程序开发,我总结出搞系统设计最重要的就是管好数据。不管咱们把界面做得像苹果官网还是村口小卖部收银系统,说到底都是在折腾数据。

我驾驶汽车从不是为了从A点到达B点,我喜欢去感受汽车,与之交流,与之融为一体。 234

接口自动化用例设计原则

接口:主要是子模块或者子系统间交互并相互作用的部分。API 接口是一种传输或操作数据的方式,广泛应用于 APP、服务端、Web 等,适用于数据的获取、更新、删除以及其他操作。较常见的就是HTTP接口和WebService接口,用得最多的是HTTP协议的POST接口和GET接口。这里说的接口是广义的,客户端与后台服务间的协议;插件间通信的接口;模块间的接口;再小到一个类提供的方法;都可以理解为接口。接口测试:是指针对模块或系统间接口进行的测试。

weixin_44240224的博客 985

DLSS Swapper项目中的版本回退功能设计与实现思考

在游戏图形技术快速发展的今天,DLSS(深度学习超级采样)、FSR(FidelityFX超级分辨率)和XeSS(Xe超级采样)等技术已成为提升游戏性能的关键。然而,不同版本DLL文件之间的兼容性问题常常让玩家头疼不已:**新版本可能带来性能提升,但也可能引入稳定性问题;旧版本虽然稳定,但可能缺少新特性**。 DLSS Swapper项目正是为了解决这一痛点而生,其核心功能之一就是**智能版本回退...

gitblog_07064的博客 293

概念、概要、详细设计编写心法

详细设计开始进入接口、字段、状态和异常处理。状态含义允许流转到CREATED订单已创建,等待支付PAID已支付,等待制作MAKING门店正在制作READYREADY制作完成,等待取餐COMPLETEDCOMPLETED用户已取餐,订单完成不允许继续流转CLOSED超时未支付或用户取消不允许继续流转REFUNDING退款处理中CLOSED设计点说明创建订单接口入参包含用户、门店、商品、杯型、温度、糖度;出参包含订单 ID、金额、状态、支付单信息支付回调幂等。

FlightYe的专栏 347
上一篇: 检查异常和未检查异常不同之处
下一篇: java大数据处理-大量数据到Excel
randomnet
博客等级 码龄19年 59粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值