37

Java 异常处理 12 条军规

 5 years ago
source link: https://mp.weixin.qq.com/s/Oo53o8Qhiu8VHH70dTIOuA?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在Java语言中,异常从使用方式上可以分为两大类:

  • CheckedException

  • UncheckedException

在Java中类的异常结构图如下:

IBN3mej.jpg!web

  1. 可检查异常需要在方法上声明,一般要求调用者必须感知异常可能发生,并且对可能发生的异常进行处理。可以理解成系统正常状态下很可能发生的情况,通常发生在通过网络调用外部系统或者使用文件系统时,在这种情况下,错误是可能恢复的,调用者可以根据异常做出必要的处理,例如重试或者资源清理等。

  2. 非检查异常是不需要在throws子句中声明的异常。 JVM根本不会强制您处理它们,因为它们主要是由于程序错误而在运行时生成的。 它们扩展了RuntimeException。 最常见的例子是NullPointerException  可能不应该重试未经检查的异常,并且正确的操作通常应该是什么都不做,并让它从您的方法和执行堆栈中出来。 在高执行级别,应记录此类异常。

  3. Error是最为严重的运行时错误,几乎是不可能恢复和处理, 一些示例是OutOfMemoryError,LinkageError和StackOverflowError。 它们通常会使程序或程序的一部分崩溃。 只有良好的日志记录练习才能帮助您确定错误的确切原因.

在异常处理时的几点建议:

1 永远不要catch中吞掉异常,否则在系统发生错误时,你永远不知道到底发生了什么

catch (SomeException e) {

return null;

}

2 尽量使用特定的异常而不是一律使用Exception这样太泛泛的异常

public void foo() throws Exception { //错误的做法}
public void foo() throws MyBusinessException1, MyBusinessException2 { //正确的做法}

一味的使用Exception,这样就违背了可检查异常的设计初衷,因为调用都不知道Exception到底是什么,也不知道该如何处理。 捕获异常时,也不要捕获范围太大,例如捕获Exception,相反,只捕获你能处理的异常,应该处理的异常。即然方法的声明者在方法上声明了不同类型的可检查异常,他是希望调用者区别对待不同异常的。

3 Never catch Throwable class

永远不要捕获Throwable,因为Error也是继承自它,Error是Jvm都处理不了的错误,你能处理?所以基于有些Jvm在Error时就不会让你catch住。

4 正确的封装和传递异常

不要丢失异常栈,因为异常栈对于定位原始错误很关键

catch (SomeException e) {

throw new MyServiceException("Some information: " + e.getMessage()); //错误的做法

}

一定要保留原始的异常:

catch (SomeException e) {

throw new MyServiceException("Some information: " , e); //正确的打开方式

}

5 要打印异常,就不要抛出,不要两者都做

catch (SomeException e) {

LOGGER.error("Some information", e);

throw e;

}

这样的log没有任何意义,只会打印出一连串的error log,对于定位问题无济于事。

6 不要在finally块中抛出异常

如果在finally中抛出异常,将会覆盖原始的异常,如果finally中真的可能会发生异常,那一定要处理并记录它,不要向上抛。

7 不要使用printStackTrace

要给异常添加上有用的上下文信息,单纯的异常栈,没有太大意义

8 Throw early catch late

异常界著名的原则,错误发生时及早抛出,然后在获得所以全部信息时再捕获处理.也可以理解为在低层次抛出的异常,在足够高的抽象层面才能更好的理解异常,然后捕获处理。

9 对于使用一些重量级资源的操作,发生异常时,一定记得清理

如网络连接,数据库操作等,可以用try finally来做clean up的工作。

10 不要使用异常来控制程序逻辑流程

我们总是不经意间这么做了,这样使得代码变更丑陋,使得正常业务逻辑和错误处理混淆不清;而且也可能会带来性能问题,因为异常是个比较重的操作。

11 及早校验用户的输入

在最边缘的入口校验用户的输入,这样使得我们不用再更底层逻辑中处处校验参数的合法性,能大大简化业务逻辑中不必要的异常处理逻辑;相反,在业务中不如果担心参数的合法性,则应该使用卫语句抛出运行时异常,一步步把对参数错误的处理推到系统的边缘,保持系统内部的清洁。

12 在打印错误的log中尽量在一行中包含尽可能多的上下文

LOGGER.debug("enter A");

LOGGER.debug("enter B"); //错误的方式

LOGGER.debug("enter A, enter B");//正确的方式

Thanks all. Happy Learning!!

SpringAutowired

一个有用的公众号

Qjma6rB.jpg!web

长按,识别二维码,加关注


Recommend

  • 43
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    Java异常处理12条军规

  • 27
    • semlinker.com 4 years ago
    • Cache

    Java 进阶之异常处理

    本文的主要内容分为 Java 异常的定义、Java 异常的处理、JVM 基础知识(异常表、JVM 指令分类和操作数栈)及深入剖析 try-catch-finally 四部分(图解形式)。 在深入剖析 try-catch-finally 部分会以字节码的角度分析为什么 final...

  • 32
    • 微信 mp.weixin.qq.com 4 years ago
    • Cache

    Java 异常处理总结

    背景 最近专门负责团队的项目质量。我在治理异常日志过程中,总结了一下Java的异常处理。上面是我整理的最近自己比较常见的异常知识地图。 异常...

  • 12
    • www.cnblogs.com 3 years ago
    • Cache

    聊聊Java中的异常及处理

    前言 在编程中异常报错是不可避免的。特别是在学习某个语言初期,看到异常报错就抓耳挠腮,常常开玩笑说编程1分钟,改bug1小时。今天就让我们来看看什么是异常和怎么合理的处理异常吧! 异常与error介绍 ...

  • 4
    • www.androidchina.net 2 years ago
    • Cache

    Java中处理异常的9个最佳实践

    原文:9 Best Practices to Handle Exceptions in Java 作者:Thorben Janssen 译者:Teixeira10 【译者注】在本文中...

  • 2
    • jack-zheng.github.io 2 years ago
    • Cache

    Java 异常处理流程

    今天在写一段补偿代码的时候突然想到一个问题,当异常发生时,后续代码是否还会被执行的问题。测试前根据主管猜测,感觉如果有 try-catch, 那么会继续执行;没有则直接跳出了,相当于 return. Scenario 1public class Test1 {...

  • 5

    本文主要是我在看《疯狂Java讲义》时的读书笔记,阅读的比较仓促,就用 markdown 写了个概要。 第七章 Java集合(重点)1、 Java集合概述 Java集合类是一种工具类,主要用来存储数量不定的对象,类似于容器

  • 0

    Please wait... We are checking your browser... yoursite.com What can I do to prevent this in the f...

  • 2

    Java线程未捕获异常处理 UncaughtExceptionHandler 当...

  • 3
    • benpaodewoniu.github.io 1 year ago
    • Cache

    java | 正确的处理异常

    如何在线程池中处理异常。 自定义处理package com.redisc;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK