Java异常整理及日志log学习

2018-11-22  本文已影响0人  Loon1993

一、异常

www:what why how

  1. Try catch

    • 先catch子类Exception 若父类Exception在子类之前会覆盖

    • 尽量进行小范围的try catch

    • 尽量避免用Exception捕获异常,其会捕获受检异常与非受检异常


    • catch异常之后需要打印出堆栈信息(切记不能重复打印)

    • 不能存在空catch块

    • 不要捕获Error(RuntimeException)

    • 尽量在高层进行异常的捕获操作

    • 避免异常丢失(见代码)

  2. throw/throws

    throw:在方法内部主动抛出异常

    throws:当方法中存在未catch的受检异常,需要在方法签名后面抛出

    • 当捕获到异常之后,希望在下一级调用中处理,可以通过throw
    • 异常传递:传递 cause 或者调用initCause方法
    • catch块中throw出Exception,就不需要进行log日志记录,避免重复记录了异常记录
    • 异常限制:在类继承的时候,方法覆盖时进行异常抛出声明,子类可以不抛出异常或则只能抛出父类的异常或其子类异常
    • 尽量不要用异常作为控制流程的方式,带来额外的消耗
  3. finally

    • 跟随在try 之后,在方法返回之前必然执行finally
    • 一般在finally中进行资源的close操作
  4. try with resource(一定需要了解资源的close方法内部的实现逻辑。否则还是可能会导致资源泄露。)

    public class Demo {
        public static void main(String[] args) {
            BufferedInputStream bin = null;
            BufferedOutputStream bout = null;
            try {
                bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
                bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")));
                int b;
                while ((b = bin.read()) != -1) {
                    bout.write(b);
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            finally {
                if (bin != null) {
                    try {
                        bin.close();
                    }
                    catch (IOException e) {
                        e.printStackTrace();
                    }
                    finally {
                        if (bout != null) {
                            try {
                                bout.close();
                            }
                            catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
    
    image
public class TryWithResource {
    public static void main(String[] args) {
        try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
             BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
            int b;
            while ((b = bin.read()) != -1) {
                bout.write(b);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 使用异常一般是内部系统调用,包括rpc调用方式。但是针对外部调用时,可以使用约定的code表示,而不应直接抛异常。
  2. 针对可恢复的情况使用受检异常,针对编程错误使用runtime exception
  3. 优先使用java提供的标准异常
  4. 抛出异常的方法,可以加上javaDoc 的@throw标记说明
  5. 当产生异常情况下,尽量使整体方法执行保持原子性
  6. 不要忽略异常:不要使用空catch块

思考

到处都是try catch 是好是坏?

二、日志

www:what why how

Code Review

  1. 使用exception,保持处理流程的原子性。

  2. 通过log.error记录日志,并且进行数据统计。

  3. 在对外输出的时候,只是通过OpenResponse进行反馈,实现封装性。

  4. 在log 日志中,没有记录对应aid 或者能代表出问题的订单。算是无效的日志。

  5. 在遇到某些业务异常,可以直接return,但是通过 catch Exception 可能会 捕获到其他异常。

上一篇 下一篇

猜你喜欢

热点阅读