专栏首页Coder的技术之路不要用抛异常做流程控制

不要用抛异常做流程控制

最近,无意中看到了别人的某段代码,是用抛出异常的方式去控制代码逻辑和流程。

比如,程序设置了几种分流策略,在rpc层的一个调用会判断当前请求该走哪个策略。但是当rpc发生异常时,catch之后返回null,然后在主流程中,对rpc结果进行判断,主动抛出异常,然后在外层catch住,打印异常日志,归到默认策略,返回空的response。

这个倒不是说不可以,但是我个人是不赞成用这种抛出异常的方式去控制逻辑的。我更倾向于在主流程检测到策略信息为空时,直接返回空的result,而不是抛异常让外层catch.

因为相比于普通的new一个类或对象等操作,new一个异常 和catch一个异常是非常耗时的。

就上面的代码来说,都运行1万次,四种行为的耗时大概是:

建立基础对象: 210万ns 建立继承对象: 490万ns 新建异常对象: 2270万ns 抛出并捕获异常: 10170万ns

我们可以看到,基础对象和继承对象的创建在同一个数量级,而创建异常对象的耗时要比前两者高一个数量级,而抛出异常并捕获,又高了一个数量级。所以,catch 异常是很耗时的。

所以,个人认为,在认为程序可能发生异常的关键点加try chtch 就够了,不要用这种机制去做逻辑控制。可能写的省事,但效率上就要打些折扣了。

那么,为什么捕获异常会耗时严重呢。我们知道 ,Java所有的异常都是继承自 Throwable,它的构造函数中有一个native方法:fillInStackTrace(),这个方法,在新创建一个异常对象时,会把堆栈信息都存一遍,即使你不用,它也不会不给你存,这个大概就是耗时的地方了。

文章分享自微信公众号:
Coder的技术之路

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 我为什么反对用异常做流程控制?

    像SSH/M这种基础框架的出现,让不少程序员“瘫痪”成了流水线工人。以前小心翼翼方能写就的逻辑分支判断,演变成了直接丢个异常然后坐等AOP拦截处理,此时的拦截器...

    曲水流觞
  • C++核心准则E.30:不要使用抛异常声明

    Exception specifications make error handling brittle, impose a run-time cost, an...

    面向对象思考
  • 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发。回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关...

    欲休
  • Flutter必备语言Dart教程02 - 控制流,异常

    我们已经完成了Dart中的变量,类型和函数的学习(如果你还没有读过它,请阅读Flutter必备语言Dart教程01 - 变量,类型,函数),现在我们来看看Dar...

    前端知否
  • flutter--Dart基础语法(二)流程控制、函数、异常

    Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,Flutter 开源、免费,拥有宽松的开源协议,支持移动...

    mukekeheart
  • Python流程控制常用工具详解

    在我们的工作中,我们使用ddagent ver。5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制。经过多次功能迭代,发现一批...

    砸漏
  • Java异常处理

    Java异常如何使用,尤其checked exception,好些语言(c#,python)都没有此类型异常,只有unchecked exception;对于j...

    码农戏码
  • Python 异常处理知识点汇总,五分钟就能学会

    异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python中,和不分高级语言...

    马哥linux运维
  • Java异常处理最佳实践

    在Java中处理异常并不是一个简单的事情。不仅仅初学者很难理解,即使一些有经验的开发者也需要花...

    Java架构师必看
  • Java:面试官上来就问:遇到异常怎么办?我懵了

    异常主要处理编译期不能捕获的错误。出现问题时能继续顺利执行下去,而不导致程序终止。确保程序的健壮性。Throwable 是所有 Java 程序中错误处理的父类 ...

    Java帮帮
  • JAVA 中异常处理的最佳实践

    前言 异常处理的问题之一是知道何时以及如何去使用它。我会讨论一些异常处理的最佳实践,也会总结最近在异常处理上的一些争论。 作为程序员,我们想要写高质量的能够解决...

    前端教程
  • 这个注解一次搞定限流与熔断降级:@SentinelResource

    在之前的《使用Sentinel实现接口限流》一文中,我们仅依靠引入Spring Cloud Alibaba对Sentinel的整合封装spring-cloud-...

    程序猿DD
  • 为什么说大多数 JavaScript 工程师写的错误处理都有问题

    程序是从上到下顺序执行的,同时可以通过一些控制语句来改变执行的路线,受控制语句影响下,程序最终的执行路线就是控制流。

    神说要有光zxg
  • 【一分钟知识】异常处理,值传递和引用传递

    异常处理 关键字:throws、throw、try、catch、finally try用来指定一块预防所有异常的程序; catch子句紧跟在try块后面,用来指...

    java思维导图
  • java异常处理(学习笔记)

    异常处理已经成为衡量一门语言是否成熟的标准之一,目前主流的编程语言大都提供了异常处理机制。增加异常处理机制后的程序有更好的容错性和健壮性。

    dejavu1zz
  • 如何优雅的处理 Java 异常,可以参考这些建议

    如果 Java 方法不能按照正常的流程执行,那么可以通过另外一种途径退出:抛出一个封装了错误信息的对象,这个就是 Java 的异常;当发生异常时,后面的代码无法...

    Bug开发工程师
  • Java异常处理机制

    我们经常看到运行程序代码,如果出现错误,我们的控制台就是一片红,这是JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上...

    JanYork_小简

扫码关注云+社区

领取腾讯云代金券