注册好域名之后怎么做个人网站,如何用服务器代替空间做网站,注册域名成功后怎样建设网站,兰州市城市建设设计院plsql例外异常可能是最被滥用的Java语言功能。 这就是为什么 让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力#xff0c;但是我们可以帮助您。 在这篇文章… plsql例外 异常可能是最被滥用的Java语言功能。 这就是为什么 让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力但是我们可以帮助您。 在这篇文章中我们请经验丰富的系统架构师和博客的长期朋友最重要的是 毛茸茸的帽子的忠实拥护者Avishai Ish-Shalom加入我们以快速讨论Java应用程序中异常的当前状态。 。 这是我们发现的。 根据定义异常与正常情况相去甚远 让我们从Java官方文档的引用开始“异常是在程序执行期间发生的事件破坏了正常的指令流程”。 诚实的披露我们自己添加了上限。 实际上在大多数应用程序中正常的指令流充满了这些所谓的“正常”异常的“正常”重复这些异常会导致“正常”中断。 在大多数应用程序中噪声水平越来越高抛出记录然后索引和分析的异常……大多数没有意义。 除了对系统造成不必要的压力外这种操作噪音还会使您失去与真正重要的异常的联系。 想象一下一个电子商务应用程序发生了一个新的重要异常该异常开始发生时表明出现了问题并受到影响例如100个用户无法检出。 现在用数千个无用的“正常”异常掩盖它并尝试了解出了什么问题。 例如大多数应用程序具有“正常”级别的错误事件。 在下面的屏幕截图中我们可以看到每小时大约有4k个事件 Takipi的错误分析仪表板–错误趋势 如果我们“幸运”那么一个新的错误会在图中显示为尖峰就像我们在这里一样在凌晨1点左右一次发生IllegalStateException发生了数十万次。 我们可以立即看到导致峰值的原因。 绿线表示事件总数其余各行表示特定的异常和记录的错误/警告。 危险来自异常只有很少很小但致命的实例被掩埋在所谓的“正常”异常级别内。 您所说的这些“正常”例外是什么 与需要更改代码才能解决的实际错误不同如今的异常表明了很多其他情况这些情况实际上并没有任何可行的见解。 他们只会减轻系统压力。 考虑任何有经验的开发人员可以预期的以下两种情况 业务错误 –用户/数据可能会执行业务流程所不允许的任何事情。 像任何形式的表单验证一样在电话号码表单字段中填写文本用空购物车签出等等。在内部NumberFormatException 在我们的最新文章中也排名前10名排名前 2位在生产环境中为1B 。 系统错误 –您从操作系统中询问的所有内容都可能会拒绝您可能无法控制。 例如尝试访问您没有权限的文件。 另一方面真正的异常是您在编写代码时没有意识到的事情例如OutOfMemoryException甚至是NullPointerException它们使事情意外地混乱了。 需要您采取措施解决问题的问题。 异常旨在崩溃和燃烧 未捕获的异常会杀死您的线程甚至在重要线程死机而其余线程仍在等待时甚至可能使整个应用程序崩溃或使其处于某种“僵尸状态”。 有些应用程序知道如何处理大多数却不知道。 Java中的异常的主要目的是帮助您捕获错误并解决它而不是跨入应用程序逻辑领域。 它们旨在帮助调试这就是为什么他们尝试从应用程序的角度包含尽可能多的信息。 这可能造成的另一个问题是状态不一致当应用程序流变得……跳动时甚至比goto语句还要糟糕。 它具有相同的缺点但也有一些曲折 它破坏了程序的流程 很难跟踪和理解接下来会发生什么 即使有finally块也很难清理 重量级与“ 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)
} 将来在内部运行的代码可能会引发异常但这些异常将被包含在内并且不会泄漏到外部。 Failuret分支明确表明了失败的可能性并且很容易遵循代码执行。 在新的Java 8 CompletableFuture特性我们最近才写过中我们可以使用completeExceptionally尽管它不那么漂亮。 使用API可以使图变得更厚 假设我们有一个使用库进行数据库访问的系统那么数据库库如何将其错误暴露给外界 欢迎来到狂野的西部。 并且请记住该库可能仍会引发一般错误例如java.net.UnknownHostException或NullPointerException 现实生活中的一个例子就是一个包装JDBC的库该库包装了JDBC只是抛出了一个通用的DBException而没有让您有机会知道出什么问题了。 也许这一切都很好并且存在连接错误或者……您实际上需要更改一些代码。 常见的解决方案是使用基本异常例如DBException的数据库库该库异常将从中继承。 这允许库用户使用一个try块捕获所有库错误。 但是可能导致库错误的系统错误呢 常见的解决方案是将发生的任何异常包装起来。 因此如果它无法解析DNS地址更多是系统错误然后是库错误它将捕获该地址并抛出此更高级别的异常-库用户应该知道要捕获该异常。 尝试捕获恶梦带有嵌套异常的提示包装了其他异常。 如果我们将Actors混合在一起则控制流程甚至变得更加混乱。 带有异常的异步编程是一团糟。 它可以杀死一个Actor 然后重新启动它一条消息将以原始错误发送给其他Actor 您将丢失堆栈。 所以你能对它做点啥 从头开始并避免不必要的异常总是很容易但是很可能并非如此。 使用现有的系统例如使用5年的应用程序您将需要进行大量的管道工作如果幸运的话并获得管理部门的批准以解决噪音问题。 理想情况下我们希望所有异常都是可操作的也就是说驱动将阻止它们再次发生的操作而不仅仅是承认有时会发生这些事情。 综上所述不可操作的异常会引起很多混乱 性能 稳定性 监控/日志分析 而且...隐藏您要查看并采取行动的真实异常 解决方案是…进行艰苦的工作以消除噪音并创建更有意义的控制流。 另一个创造性的解决方案是更改日志级别如果这不是可行的例外请不要将其记录为错误。 那只是一个装饰性的解决方案但可能会让您完成80的工作。 归根结底日志和仪表板只是装饰需要解决该问题的核心并完全避免无法采取行动的异常。 在塔基皮Takipi我们最近发现平均记录的错误中有97来自前10个唯一错误 。 要查看应用程序中异常和已记录错误的当前状态请连接Takipi代理您将在几分钟内完全了解代码在生产环境中的行为方式以及如何修复。 检查一下 。 最后的想法 最重要的是您是否有一个不会导致代码更改的异常 您甚至不应该浪费时间查看它。 这篇文章是基于Avishai所说的“可操作的异常”的闪电演讲 翻译自: https://www.javacodegeeks.com/2016/06/truth-behind-big-exceptions-lie.htmlplsql例外