plsql例外_大例外背后的真相

plsql例外

异常可能是最被滥用的Java语言功能。 这就是为什么

让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力,但是我们可以帮助您。

在这篇文章中,我们请经验丰富的系统架构师和博客的长期朋友(最重要的是, 毛茸茸的帽子的忠实拥护者)Avishai Ish-Shalom加入我们,以快速讨论Java应用程序中异常的当前状态。 。 这是我们发现的。

根据定义,异常与正常情况相去甚远

让我们从Java官方文档的引用开始:“异常是在程序执行期间发生的事件,破坏了正常的指令流程”。 诚实的披露:我们自己添加了上限。

实际上,在大多数应用程序中,正常的指令流充满了这些所谓的“正常”异常的“正常”重复,这些异常会导致“正常”中断。

exception-meme-300x259 @ 2x

在大多数应用程序中,噪声水平越来越高,抛出,记录,然后索引和分析的异常……大多数没有意义。

除了对系统造成不必要的压力外,这种操作噪音还会使您失去与真正重要的异常的联系。 想象一下一个电子商务应用程序发生了一个新的重要异常,该异常开始发生时,表明出现了问题并受到影响,例如100个用户无法检出。 现在,用数千个无用的“正常”异常掩盖它,并尝试了解出了什么问题。

例如,大多数应用程序具有“正常”级别的错误事件。 在下面的屏幕截图中,我们可以看到每小时大约有4k个事件:

例外情况

Takipi的错误分析仪表板–错误趋势

如果我们“幸运”,那么一个新的错误会在图中显示为尖峰,就像我们在这里一样,在凌晨1点左右(一次)发生IllegalStateException,发生了数十万次。 我们可以立即看到导致峰值的原因。

绿线表示事件总数,其余各行表示特定的异常和记录的错误/警告。

危险来自异常,只有很少,很小但致命的实例被掩埋在所谓的“正常”异常级别内。

您所说的这些“正常”例外是什么?

与需要更改代码才能解决的实际错误不同,如今的异常表明了很多其他情况,这些情况实际上并没有任何可行的见解。 他们只会减轻系统压力。 考虑任何有经验的开发人员可以预期的以下两种情况:

  1. 业务错误 –用户/数据可能会执行业务流程所不允许的任何事情。 像任何形式的表单验证一样,在电话号码表单字段中填写文本,用空购物车签出,等等。在内部,NumberFormatException 在我们的最新文章中也排名前10名,排名前 2位在生产环境中为1B 。
  2. 系统错误 –您从操作系统中询问的所有内容都可能会拒绝,您可能无法控制。 例如,尝试访问您没有权限的文件。

另一方面,真正的异常是您在编写代码时没有意识到的事情,例如OutOfMemoryException甚至是NullPointerException,它们使事情意外地混乱了。 需要您采取措施解决问题的问题。

Inconceviable-Exceptions-300x278 @ 2x

异常旨在崩溃和燃烧

未捕获的异常会杀死您的线程,甚至在重要线程死机而其余线程仍在等待时,甚至可能使整个应用程序崩溃或使其处于某种“僵尸状态”。 有些应用程序知道如何处理,大多数却不知道。

Java中的异常的主要目的是帮助您捕获错误并解决它,而不是跨入应用程序逻辑领域。 它们旨在帮助调试,这就是为什么他们尝试从应用程序的角度包含尽可能多的信息。

这可能造成的另一个问题是状态不一致,当应用程序流变得……跳动时,甚至比goto语句还要糟糕。 它具有相同的缺点,但也有一些曲折:

  1. 它破坏了程序的流程
  2. 很难跟踪和理解接下来会发生什么
  3. 即使有finally块也很难清理
  4. 重量级,与“ goto”不同,它随身携带所有堆栈和其他额外数据

无例外地使用“错误”流程

如果您尝试使用异常处理应由应用程序逻辑处理的可预测情况,那么您会遇到麻烦。 大多数Java应用程序都遇到同样的麻烦。

本书预计不会发生的问题并不是真正的例外。 一个有趣的解决方案来自Scala的Futures –毫无例外地处理错误。 来自官方scala文档的Scala示例:

import scala.util.{Success, Failure}val f: Future[List[String]] = Future {session.getRecentPosts
}f onComplete {case Success(posts) => for (post <- posts) println(post)case Failure(t) => println("An error has occured: " + t.getMessage)
}

将来在内部运行的代码可能会引发异常,但这些异常将被包含在内并且不会泄漏到外部。 Failure(t)分支明确表明了失败的可能性,并且很容易遵循代码执行。

在新的Java 8 CompletableFuture特性(我们最近才写过)中,我们可以使用completeExceptionally(),尽管它不那么漂亮。

使用API​​可以使图变得更厚

假设我们有一个使用库进行数据库访问的系统,那么数据库库如何将其错误暴露给外界? 欢迎来到狂野的西部。 并且请记住,该库可能仍会引发一般错误,例如java.net.UnknownHostException或NullPointerException

现实生活中的一个例子就是一个包装JDBC的库,该库包装了JDBC,只是抛出了一个通用的DBException,而没有让您有机会知道出什么问题了。 也许这一切都很好,并且存在连接错误,或者……您实际上需要更改一些代码。

常见的解决方案是使用基本异常(例如DBException)的数据库库,该库异常将从中继承。 这允许库用户使用一个try块捕获所有库错误。 但是,可能导致库错误的系统错误呢? 常见的解决方案是将发生的任何异常包装起来。 因此,如果它无法解析DNS地址(更多是系统错误,然后是库错误),它将捕获该地址并抛出此更高级别的异常-库用户应该知道要捕获该异常。 尝试捕获恶梦,带有嵌套异常的提示包装了其他异常。

如果我们将Actors混合在一起,则控制流程甚至变得更加混乱。 带有异常的异步编程是一团糟。 它可以杀死一个Actor ,然后重新启动它,一条消息将以原始错误发送给其他Actor ,您将丢失堆栈。

所以你能对它做点啥?

从头开始并避免不必要的异常总是很容易,但是很可能并非如此。 使用现有的系统(例如使用5年的应用程序),您将需要进行大量的管道工作(如果幸运的话,并获得管理部门的批准以解决噪音问题)。

理想情况下,我们希望所有异常都是可操作的,也就是说,驱动将阻止它们再次发生的操作,而不仅仅是承认有时会发生这些事情。

综上所述,不可操作的异常会引起很多混乱:

  • 性能
  • 稳定性
  • 监控/日志分析
  • 而且...隐藏您要查看并采取行动的真实异常

生活是痛苦768x432

解决方案是…进行艰苦的工作,以消除噪音并创建更有意义的控制流。 另一个创造性的解决方案是更改日志级别,如果这不是可行的例外,请不要将其记录为错误。 那只是一个装饰性的解决方案,但可能会让您完成80%的工作。

归根结底,日志和仪表板只是装饰,需要解决该问题的核心并完全避免无法采取行动的异常。

在塔基皮(Takipi),我们最近发现平均记录的错误中有97%来自前10个唯一错误 。 要查看应用程序中异常和已记录错误的当前状态,请连接Takipi代理,您将在几分钟内完全了解代码在生产环境中的行为方式(以及如何修复)。 检查一下 。

最后的想法

最重要的是,您是否有一个不会导致代码更改的异常? 您甚至不应该浪费时间查看它。

这篇文章是基于Avishai所说的“可操作的异常”的闪电演讲:

翻译自: https://www.javacodegeeks.com/2016/06/truth-behind-big-exceptions-lie.html

plsql例外

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

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

相关文章

滴滴java开发面试题_Java开发经典面试题(十二)

好久没有来更新我的面试题了&#xff0c;不知道关注我的小伙伴有没有失联啊&#xff1f;&#xff01;呼叫&#xff01;好了开始我们今天的正题分享&#xff01;1、如何从FutureTask不阻塞获取结果get(long timeout,TimeUnit unit)&#xff0c;超时则返回轮询&#xff0c;先通过…

hashmap大小_调整HashMap的大小:未来的危险

hashmap大小最近&#xff0c;我偶然发现了一个错误&#xff0c;该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是泄漏抽象的一个很好的例子。 只有了解数据结构的实现级别详细信息&#xff0c;才能帮助我解决当前的问题。 因此&#xff0c;我希望与他人分享…

apache spark_Apache Spark软件包,从XML到JSON

apache sparkApache Spark社区为扩展Spark付出了很多努力。 最近&#xff0c;我们希望将XML数据集转换为更易于查询的内容。 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣。 XML是一种众所周知的格式&#xff0c;但是有时使用起来可能很复杂。 例如&#xff0c;在Apa…

【OpenGL从入门到精通(七)】OpenGL中的数学

1.向量单位化 2.三维向量点乘/点积&#xff08;结果为标量&#xff09; 3.三维向量叉乘&#xff08;叉积&#xff09;结果为向量 3.坐标平移 因为在OpenGL中使用的都是齐次坐标&#xff0c;即x , y , z , w 如果使得点(0, 0, 0) 平移到(1, 2, 3)位置。将坐标表示为矩阵的形式&…

javafx窗体程序_JavaFX实际应用程序:SkedPal

javafx窗体程序“真实世界的应用程序”系列中的一个新条目。 这次是SkedPal &#xff0c;这是一个用于智能管理忙人生活的应用程序。 我一直在咨询SkedPal团队有关JavaFX的事务&#xff0c;并且在他们决定开始使用我的CalendarFX框架来满足他们的日历要求时&#xff0c;我也在咨…

kafka 发布订阅_在Kafka中发布订阅模型

kafka 发布订阅这是第四个柱中的一系列关于同步客户端集成与异步系统&#xff08; 1&#xff0c; 2&#xff0c; 3 &#xff09;。 在这里&#xff0c;我们将尝试了解Kafka的工作方式&#xff0c;以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 &#xff1a; Kafka是…

apache camel_使用Apache Camel进行负载平衡

apache camel在此示例中&#xff0c;我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中&#xff0c;负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量&#xff08;并发用户&#xff09;和应用程…

lombok 自动使用_Lombok,自动值和不可变项

lombok 自动使用我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇…

邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)

目录&#xff1a;前言行情伪需求过程1.前戏2.买域名3.网易企业邮箱4.模糊的需求5.晚饭后6.临时邮箱16.临时邮箱27.域名版临时邮箱8.遇见问题8.1.DNSPOD8.2.换种思路拓展1.思路2.后续2.1.简单2.2.自建临时邮箱后话记一次需求不明的亏看完这篇文章你会学到&#xff1a; 免费企业邮…

java 补充日期_Java 9对可选的补充

java 补充日期哇&#xff0c;人们真的对Java 9对Stream API的添加感兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 无需解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选…

【Python科学计算系列】行列式

1.二元线性方程组求解 import numpy as np a np.array([[3, -2], [2, 1]]) b np.array([12, 1]) d np.linalg.solve(a, b) print(d) 2.三阶行列式求值 import numpy as np a np.array([[1, 2, -4], [-2, 2, 1], [-3, 4, -2]]) d np.linalg.det(a) print(d) 3.行列式的余…

【Python科学计算系列】矩阵

1.矩阵的幂计算&#xff08;设计思想&#xff1a;递归&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def matrixPow(Matrix,n):if(type(Matrix)list):Matrixnp.array(Matrix)if(n1):return Matrixelse:return np.matmul(Matrix,matrixPow(…

swarm 本地管理远程_带有WildFly Swarm的远程JMS

swarm 本地管理远程我再次在博客中谈论WildFly群&#xff1f; 简短的版本是&#xff1a;我需要对远程JMS访问进行测试&#xff0c;并且拒绝设置复杂的功能&#xff08;如完整的应用程序服务器&#xff09;。 这个想法是要有一个简单的WildFly Swarm应用程序&#xff0c;该应用程…

java解码_Java数组已排序解码

java解码排序是我们在计算机科学中学习的第一个算法。 排序是一个非常有趣的领域&#xff0c;它有大约20多种算法&#xff0c;而且总是很难确定哪种算法最好。 排序算法的效率是根据占用的时间和所需的空间来衡量的。 一些时间气泡排序是最好的&#xff0c;因为它没有空间需求&…

【数论系列】反函数

一、判断反函数是否存在&#xff1a; 由反函数存在定理&#xff1a;严格单调函数必定有严格单调的反函数&#xff0c;并且二者单调性相同&#xff1a; 1、先判读这个函数是否为单调函数&#xff0c;若非单调函数&#xff0c;则其反函数不存在。 设yf(x)的定义域为D&#xff…

java附加属性_Java 9附加流

java附加属性Java 9即将发布&#xff01; 它不仅仅是Jigsaw项目 。 &#xff08;我也很惊讶。&#xff09;它给平台带来了很多小的变化&#xff0c;我想一一看一下。 我将标记所有这些帖子&#xff0c;您可以在这里找到它们。 让我们从…开始 流 Streams学习了两个新技巧。 第…

envi最大似然分类_闲谈最大后验概率估计(MAP estimate)amp;极大似然估计(MLE)和机器学习中的误差分类...

上一篇文章中提到了一个有趣的实验&#xff0c;简单来说就是1-100中有若干个数字是“正确的”&#xff0c;只告诉其中一部分“正确的”数字&#xff0c;去猜全部“正确的”数字。为了严谨的去研究这个问题&#xff0c;我们需要将一些概念进行抽象。首先&#xff0c;把提前告知的…

html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...

LOL手游上线已经有一段时间了&#xff0c;虽然绝大多数情况下LOL端游的内容被继承到了手游当中&#xff0c;但是仍然有一部分端游的内容尚未出现在手游之内。今天小编就带领大家来盘点一下&#xff0c;那些未来可能出现在手游当中的端游内容。排位赛ban选英雄机制Moba游戏排位赛…

光盘 机密_使用保险柜管理机密

光盘 机密您如何存储秘密&#xff1f; 密码&#xff0c;API密钥&#xff0c;安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置&#xff0c;不得以纯文本格式提供。 实际上&#xff0c;不得在任何位置以明文形式存储它。 可以使用Spring Cloud Confi…

junit5 动态测试_JUnit 5 –动态测试

junit5 动态测试在定义测试时&#xff0c;JUnit 4有一个很大的弱点&#xff1a;它必须在编译时发生。 现在&#xff0c;JUnit 5将解决此问题&#xff01; Milestone 1 刚刚发布 &#xff0c;它带有全新的动态测试&#xff0c;可以在运行时创建测试。 总览 本系列中有关JUnit 5…