首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java 异常处理 20 个最佳实践,你知道几个?

异常英文单词是 exception,异常本质是程序错误,包括程序逻辑错误和系统错误。比如使用空引用、数组下标越界、内存溢出错误等,这些都是意外情况,背离我们程序本身意图。...始终正确包装自定义异常中异常,以便堆栈跟踪不会丢失 catch (NoSuchMethodException e) { throw new MyServiceException("Some information...: " + e.getMessage()); //错误方式 } 这破坏了原始异常堆栈跟踪,并且始终是错误,正确做法是: catch (NoSuchMethodException e) {...这个原则隐含地说,你将更有可能把它放在低级方法中,在那里你将检查单个值是否为空或不适合。而且你会让异常堆栈跟踪上升好几个级别,直到达到足够抽象级别才能处理问题。...只抛出方法相关异常 相关性对于保持应用程序清洁非常重要。一种尝试读取文件方法,如果抛出 NullPointerException,那么它不会给用户任何相关信息。

77520

Java一分钟之——异常链:追踪错误源头

异常链简介 异常链允许将新抛出异常与原有异常相关联,这样在异常堆栈跟踪中,可以看到异常之间因果关系。...JavaThrowable类提供了initCause()方法来设置原始异常,以及getCause()方法来获取它。...避免策略 始终记录原始异常:在捕获异常时,使用initCause()记录原始异常,以便追踪错误源头。...CustomException构造函数接受一个Throwable参数,这个参数会自动调用initCause(),将原始IOException链接到新异常实例。...通过正确使用initCause(),我们可以追踪错误源头,从而更快地定位和修复问题。在编写代码时,要养成记录原始异常习惯,避免过度包装异常,确保异常链完整性和准确性。

9010
您找到你想要的搜索结果了吗?
是的
没有找到

测试如何处理Java异常

声明可能抛出特定检查异常 错误示范: public void test() throws Exception { } 尽量避免使用上面的代码,必须声明该方法可能引发特定检查异常。...} 上面的命令可能会失去异常堆栈跟踪,对于排查问题制造了障碍。...正确示范: catch (NoSuchMethodException e) { throw new MyServiceException("自定义错误: " , e); } 不要同时记录抛出异常...错误示范: catch (NoSuchMethodException e) { LOGGER.error("错误:", e); throw e; } 如上面的代码所示,抛出记录可能会在日志文件中导致多个日志消息...在上述情况下,如果someMethod()出现异常,并且在finally块中,cleanUp()也出现异常,则该方法之外其他异常将消失,原始第一个异常(正确原因)将永远消失。

62510

处理 Java 异常 10 个最佳实践「译文」

如果需要抛出很多异常,我们就要去声明可以由方法抛出特定异常,这样才可以更好去针对某个异常进行处理。...: " + e.getMessage()); //Incorrect way } 上述代码中,仅靠抛出异常信息,无法进行堆栈跟踪。...抛出记录同一个异常会导致日志文件中输出多条日志消息,这样在开发人员想通过查看日志来解决问题时候,就会带来很大困难。...1.9 不要使用 printStackTrace() 语句 在代码中使用 printStackTrace() ,它不会附加任何上下文信息,这样其他人完全不知道怎么去使用它,也就无法对这些堆栈进行跟踪...据研究人员称,这个危险漏洞具有支持中间人(MITM)攻击能力,因此黑客可以很简单利用它来阻止提供商和用户之间通信,甚至可以使所有用户无法连接真正 V**服务器,直接重定向到黑客危险服务器

40250

Java 异常处理 9 个最佳实践

但是,使用 try 代码块是有原因,一般调用一个或多个可能抛出异常方法,而且,你自己也可能会抛出一个异常,这意味着代码可能不会执行到 try 代码块最后部分。结果就是,你并没有关闭资源。...这通常是由于一个被忽略异常造成。开发者可能会非常肯定,它永远不会抛出,并添加一个 catch 块,不做处理或不记录它。而当你发现这个块时,你很可能甚至会发现其中有一个“这永远不会发生”注释。...8、不要记录日志和抛出错误 这可能是该文章中最常被忽略最佳实践。 你可以找到很多其中有一个异常被捕获代码片段,甚至是一些代码库,被记录和重新抛出。 ?...正如在最佳实践#4中所解释那样,异常消息应该描述异常事件。 堆栈跟踪告诉你在哪个类,方法和行中抛出异常。 如果你需要添加其他信息,则应该捕获异常并将其包装在自定义信息中。...Exception 类提供了特殊构造函数方法,它接受一个 Throwable 作为参数。另外,你将会丢失堆栈跟踪原始异常消息,这将会使分析导致异常异常事件变得困难。 ?

75520

有效处理Java异常三个原则,你知道吗?

在有效使用异常情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你异常没有回答以上全部问题,那么可能你没有很好地使用它们。...提早抛出 异常堆栈信息提供了导致异常出现方法调用链精确顺序,包括每个方法调用类名,方法名,代码文件名甚至行数,以此来精确定位异常出现现场。 ?...以 展示了FileInputStream类open()方法抛出NullPointerException情况。...通过逐步回退跟踪堆栈信息并检查代码,我们可以确定错误原因是向readPreferences()传入了一个空文件名参数。...同时,不管HTML还是C/S版本,配置信息都是在服务器读取,而错误信息需要显示给Web浏览器或者客户端程序。 readPreferences()应当在设计时将这些未来需求也考虑在内。

1.6K10

带你认识 flask 错误处理

堆栈跟踪在调试错误时非常有用,因为它们显示堆栈中调用顺序,一直到产生错误行: (venv) $ flask run * Serving Flask app "microblog" * Running...04 通过电子邮件发送错误 Flask提供默认错误处理机制另一个问题是没有通知机制,错误堆栈跟踪只是被打印到终端,这意味着需要监视服务器进程输出才能发现错误。...所以我第一个解决方案是配置Flask在发生错误之后立即向我发送一封电子邮件,邮件正文中包含错误堆栈跟踪正文。...运行该应用并再次触发SQLAlchemy错误,以查看运行模拟电子邮件服务器终端会话如何显示具有完整堆栈跟踪错误电子邮件。 这个功能第二个测试方法是配置一个真正电子邮件服务器。...除了有很多服务器进程并且非常繁忙应用之外,这种情况是不太可能,所以现在我不会为此担心。 此时,你可以尝试再次重现该错误,以了解新表单验证方法如何防止该错误

2K30

处理Java异常9个最佳实践

try块中所有语句都将被执行,资源将被关闭。 但是你添加了try块是有原因。你调用一个或多个可能抛出异常方法,或者你自己抛出异常。这意味着你可能无法到达try块末尾。因此,你将不会关闭资源。...开发人员可能非常确定它永远不会抛出并添加了一个不处理或记录catch块。当你找到这个代码块时,你很可能甚至会发现一个著名“This will never happen ”评论。...有人可能会删除阻止异常事件验证而不会认识到这会产生问题。或者抛出异常代码会被更改,现在抛出同一个类多个异常,并且调用代码不会阻止所有这些异常。...堆栈跟踪告诉你抛出异常类,方法和行。 如果需要添加其他信息,则应捕获异常并将其包装在自定义异常中。但请务必遵循最佳做法9。...执行此操作时,请确保将原始异常设置为cause。该异常类提供了接受一个特定构造方法Throwable作为参数。否则,你将丢失原始异常堆栈跟踪和消息,这将导致难以分析导致异常异常事件。

74650

去公司第一天老大问我:内存泄露检测工具你知道几个?

但是,要在生产服务器启用JFR,必须具有商业许可证。在JDK为其他目的使用Java任务控制(JMC)不需要商业许可证。 下面的部分展示了图并描述了如何使用Java飞行记录器调试内存泄漏。...如果泄漏速度很慢,则可能有一些此对象分配,并且可能没有样本。此外,可能只有特定分配站点才会导致泄漏。总而言之,这并不能保证为泄漏找到正确分配堆栈跟踪,但它可能会提供重要线索。...当 java.lang.OutOfMemoryError抛出异常时,也会打印堆栈跟踪。...注意:应用程序调用api也可能无意中保存了对象引用。 此错误另一个潜在来源是过度使用终结器应用程序。如果类具有finalize方法,则该类型对象在垃圾收集时不会回收其空间。...”,并且打印堆栈跟踪顶部框架是本机方法,则这表示本机方法遇到了分配失败。

30820

JavaScript中错误正确处理方式,你用对了吗?

在这里异常会调用堆栈进行冒泡。同时错误会展开堆栈,这对调试非常有帮助。除了抛出异常,解释器还会沿着栈寻找另外处理。这也带来了可以从堆栈顶部处理错误可能。...但这还是一种较差错误处理,需要我们从堆栈中一步步追溯原始异常。 可以采用一种替代方案,用自定义错误方式来结束这种较差错误处理。当你向错误中添加更多详细信息时,会让这种方法变得很有帮助。...下面是在服务器记录错误示例: // scripts/errorAjaxHandlerDom.js window.addEventListener('error', function (e) {...确保你错误处理处在相同域中,这样会保留原始消息,堆栈和自定义错误对象。...以下是该异常处理在服务器报告内容。请注意,输出内容会根据浏览器不同而不同。 从错误处理中可以看到,错误来自于异步代码setTimeout( )功能。

61510

9种处理Java异常最佳实践

JVM抛出严重错误问题,这些问题不会由应用程序处理。 比如说:OutOfMemoryError或StackOverflowError。 两者都是由应用程序无法控制情况引起,无法处理。...} } 「7.不要忽略异常」 您是否曾经分析过仅在用例第一部分得到执行错误报告? 这通常是由忽略异常引起。开发人员可能非常确定不会将其抛出,并添加了一个不会处理或记录catch块。...您可以找到许多代码段,甚至可以找到捕获,记录和重新抛出异常库。...堆栈跟踪会告诉您在哪个类,方法和行中引发了异常。 如果需要添加其他信息,则应捕获异常并将其包装在自定义异常中。但是请确保遵循最佳实践9。...执行此操作时,请确保将原始异常设置为原因。该异常类提供了接受一个特定构造方法Throwable作为参数。否则,您将丢失堆栈跟踪原始异常消息,这将使分析导致您异常异常事件变得困难。

44310

为什么说Go错误处理是最棒

= nil、记录错误外,我们不会错误进行任何处理!我们可能会遇到数据损坏或无法智能处理其他无法预料问题,或者重试函数调用,取消进一步程序流,或者在最坏情况下关闭程序。...,则错误堆栈跟踪将在运行时弹出并记录到控制台,但不会对发生问题进行明确代码逻辑处理。...您criticalOperation函数不需要显式处理错误流,因为在try块中发生任何异常都将在运行时引发,并给出错误原因堆栈跟踪。...这样错误不是因为一个不可读、神秘堆栈跟踪而崩溃,而是由于我们可以添加人类可读上下文因素导致,应该通过上面所示清晰错误链来处理异常问题。...总结一下有关在Go中编写惯用错误处理最重要建议: 为您错误添加可用于开发人员时堆栈跟踪 对返回错误做点什么,不要只是把它们放到main记录下来,然后忘记它们 保持您错误链明确 当我编写Go代码时

54420

Meatier — 内容丰富Meteor框架

Meteor非常出色,它开辟了实时Web开发新时代!但是三年过去了,它也上了年纪。Meatier这个项目旨在实现同Meteor完全一样功能,但并不采用单一而庞大结构。...下面是我对Meteor主要抱怨: 基于Node 0.10,并且在近期不会改变 构建系统不支持代码分离(事实完全相反,打包整个应用) 全局变量(并没有名称空间) 太依赖websockets(并不是每个页面都需要它...redux-form 非常棒状态跟踪,与 react 完美结合 客户端缓存 Minimongo redux 加分项,日志,时光旅行,撤销功能 Socket 服务器 DDP-server socketcluster...Blaze React 虚拟DOM,服务端渲染,异步路由等等 构建系统 meteor webpack Meteor中Webpack使用非常有限 CSS 魔术般地打包和提供 css-modules 组件范围...并发测试 Linting 自行选择 xo 不用管理.xxx配置文件,能修复错误 Routing FlowRouter redux-simple-router 状态路由,react-router SSR,

88390

JavaScript错误处理完全指南

; 创建后,错误对象将显示三个属性: message:包含错误消息字符串 name:错误类型 stack:函数执行堆栈跟踪 例如,如果我们创建一个新 TypeError 对象,带有适当消息,该...多数开发人员认为错误和异常是同一回事。实际,一个错误对象只有在被抛出时才成为异常。...这个报告是一个 堆栈跟踪,对于跟踪代码中问题很有帮助。 堆栈跟踪顺序是从底到顶。...toUppercase toUppercase 在第 3 行爆炸了 除了在浏览器控制台中看到这个堆栈跟踪外,你还可以在错误对象 stack 属性上访问它。...其他团队成员总是能访问 error.message,更重要是你可以检查堆栈跟踪。除了 Promise.reject,我们还可以通过 抛出 异常来退出 Promise 链。

4.9K20

基础篇:深入解析JAVA异常

如果方法里有需要外部处理异常,请声明throws抛出具体异常,方便调用方处理 在方法上声明抛出异常时,也需要进行注释说明。...(RunTimeExcption e)代码是不会被执行 不要捕获Throwable类 因为Throwable是Error和Exception超类,Error是JVM、系统级别错误,一般不应捕捉处理...捕捉异常后不要不处理:导致无法定位异常错误发生根源,建议至少也要日志输出下 不要记录抛出异常:导致同一个异常输出多条相同日志,不容易找到错误根源 包装新异常时不要丢弃原始异常 如果丢弃原始异常,...将会丢失堆栈跟踪原始异常消息,会使得分析异常事件变得困难 注意:异常会影响性能 异常处理性能成本非常高,创建一个异常非常慢,抛出一个异常又会消耗1~5ms。...,只能用于抛出一种异常,用来抛出方法或代码块中异常,受查异常和非受查异常都可以被抛出 throws 关键字用在方法声明,可以抛出多个异常,用来标识该方法可能抛出异常列表。

35910

Meteor开发指南 — 响应式GraphQL

应用开发者不需要写任何显式代码来获取那条评论。 这就是响应式GraphQL。你不必重新获取数据或是手动重新加载网页。 基本,它就是Meteor但是加上了GraphQL。...你应用服务器并不知道响应式或如何验证错误查询。它仅仅暴露一些GraphQL数据模式。 响应式由另一个服务器处理,也被称作失效服务器。 失效服务器 ?...这是一个轻量级服务器,用来追踪所有通过GraphQL数据模式发送到客户端文档版本。你应用服务器发送所有查询请求和修改到这个服务器。 你应用客户端会与这个失效服务器交流并且观察所有的失效记录。...如果有失效记录的话,它会从GraphQL应用服务器获取数据。(失效服务器会判断旧版本是否失效,返回新版本数据) 整个流程如此设计,所以维持了使用方便性并且没有牺牲性能。...这个失效服务器并不真的处理数据。通常它对数据一无所知。你可以把它理解成一个分布式版本跟踪服务。 Meteor计划是把失效服务器作为一个开源项目,并且隶属于响应式GraphQL项目。

986100

Python 6.1 错误处理

解读错误信息是定位错误关键。我们从上往下可以看到整个错误调用函数链: Traceback(most recent call last) 告诉我们这是错误跟踪信息。...根据层层错误调出,最终确定错误类型是ZeroDivisionError,至此找出了错误源头。 记录错误 如果不捕获错误,自然可以让Python解释器打印出错误堆栈,但程序也就结束了。...通过配置,logging可以把错误记录到日志文件中,方便日后查看。 抛出错误 因为错误是class,捕获一个错误就是捕获该class一个实例。因此,错误不是凭空产生,而是有意创建并抛出。...Python内置函数会抛出很多种类错误,我们自己编写函数也可以抛出错误。...其实这种错误处理方法非常常见,捕获错误目的只是记录一下, 便于后续跟踪。但是,由于当前函数不知道该怎么处理错误。所以,最恰当方式就是继续往上抛,让顶层调用者去解决。

53710

Java 中处理异常 9 个实践

try 内所有语句都将被执行,资源也会被关闭。但是你在 try 里调用了一个或多个可能抛出异常方法,或者自己抛出异常。这意味着可能无法到达 try 末尾。因此将不会关闭这些资源。...开发人员可能非常确信它不会抛出,并添加一个无法处理或无法记录catch 语句。当你发现它时候,你很可能就会明白一句著名的话“This will never happen”。...不要记录抛出一个异常 这可能是最常被忽略。你可以在许多代码片段或者库文件里发现,有异常会被捕获、记录和重新抛出。...正如在上述第4个中所解释那样,异常消息应该描述异常事件。堆栈会告诉你在哪个类、方法和行中异常被抛出。 如果你需要添加额外信息,应该捕获异常并将其包装在一个自定义信息中。...Exception 类提供了一些特定构造函数方法,这些方法可以接受Throwable 作为参数。否则,你将丢失原始异常堆栈跟踪和消息,这将使你很难分析导致异常事件。

48810

【148期】最最最全面的Java异常面试及解答

在有效使用异常情况下,异常能清晰回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪”抛出,异常信息回答了“为什么”会抛出。...Throwable 包含了其线程创建时线程执行堆栈快照,它提供了 printStackTrace() 等接口用于获取堆栈跟踪数据等信息。 2. Error(错误) 定义:Error 类及其子类。...throws 关键字用在方法声明,可以抛出多个异常,用来标识该方法可能抛出异常列表。...不要忽略异常 很多时候,开发者很有自信不会抛出异常,因此写了一个catch块,但是没有做任何处理或者记录日志。...Exception 类提供了特殊构造函数方法,它接受一个 Throwable 作为参数。否则,你将会丢失堆栈跟踪原始异常消息,这将会使分析导致异常异常事件变得困难。

55520
领券