首页 > 其他分享 >20个异常处理的最佳实践

20个异常处理的最佳实践

时间:2024-07-13 23:33:20浏览次数:13  
标签:20 实践 try 最佳 finally catch return 堆栈 异常

  1. 尽量不要 catch RuntimeException,比如 NullPointerException、IndexOutOfBoundsException 等等,应该用预检查的方式来规避。

  2. 尽量使用 try-with-resource 来关闭资源:禁止在 try 块中直接关闭资源,因为一旦 close() 之前发生了异常,那么资源就无法关闭

  3. 不要捕获 Throwable:很可能把超出程序处理能力之外的错误也捕获了

  4. 不要省略异常信息的记录

  5. 不要记录了异常又抛出了异常

  6. 不要在 finally 块中使用 return:try 块中的 return 语句执行成功后,并不会马上返回,而是继续执行 finally 块中的语句,如果 finally 块中也存在 return 语句,那么 try 块中的 return 就将被覆盖。

   private int x = 0;
   public int checkReturn() {
       try {
           return ++x;
       } finally {
           // try 块中 x 返回的值为 1,到了 finally 块中就返回 2 了
           return ++x;
       }
   }
  1. 抛出具体定义的检查性异常而不是 Exception

  2. 捕获具体的子类而不是捕获 Exception 类

  3. 自定义异常时不要丢失堆栈跟踪

  4. finally 块中不要抛出任何异常:如果在 finally 块中抛出异常,可能会导致原始异常被掩盖

  5. 不要在生产环境中使用 printStackTrace()

  • ``printStackTrace()` 方法将异常的堆栈跟踪信息输出到标准错误流中,这可能会暴露敏感信息,如文件路径、用户名、密码等。
  • printStackTrace() 方法会将堆栈跟踪信息输出到标准错误流中,这可能会影响程序的性能和稳定性。在高并发的生产环境中,大量的异常堆栈跟踪信息可能会导致系统崩溃或出现意外的行为。
  • 由于生产环境中往往是多线程、分布式的复杂系统,printStackTrace() 方法输出的堆栈跟踪信息可能并不完整或准确。
  1. 对于不打算处理的异常,直接使用 try-finally,不用 catch
  2. 记住早 throw 晚 catch 原则
  3. 只抛出和方法相关的异常
  4. 切勿在代码中使用异常来进行流程控制
  5. 尽早验证用户输入以在请求处理的早期捕获异常
  6. 一个异常只能包含在一个日志中
// 反例
log.debug("Using cache sector A");
log.debug("Using retry sector B");

// 正例
// 在多线程环境中,这两行紧挨着的日志代码中间可能会输出很多其他的内容,导致问题查起来会很难受。
LOGGER.debug("Using cache sector A, using retry sector B");
  1. 将所有相关信息尽可能地传递给异常
  2. 终止掉被中断线程
// 反例
while (true) {
  try {
    Thread.sleep(100000);
  } catch (InterruptedException e) {} //别这样做
  doSomethingCool();
}

// 正例
// 应该尽最大努力完成正在做的事情,并完成当前执行的线程,而不是忽略 InterruptedException
while (true) {
  try {
    Thread.sleep(100000);
  } catch (InterruptedException e) {
    break;
  }
}
doSomethingCool();
  1. 对于重复的 try-catch,使用模板方法

标签:20,实践,try,最佳,finally,catch,return,堆栈,异常
From: https://www.cnblogs.com/sprinining/p/18300978

相关文章

  • 2024辽宁省大学数学建模竞赛试题思路
    A题(1)建立模型分析低空顺风风切变对起飞和降落的影响模型假设飞机被视为质点,忽略其尺寸和形状对风阻的影响。风切变仅考虑顺风方向的变化,忽略其他方向的风切变。飞机的飞行速度、高度和姿态(如迎角、俯仰角)是变化的,且可连续表示。地面效应对飞机的影响在模型中适当考虑(如......
  • 【2023-2024第二学期助教总结】
    一、助教工作的具体职责和任务协助系里制作材料整理帮助老师批改作业回答学生问题考前给同学将题目二、助教工作的每周时长和具体安排每周四个小时批改作业实验课帮助老师给同学排错反馈同学问题,安排实验时间三、因为自己的助教工作,对课程、老师、学生的帮助和带来的改变(典......
  • 【反悔贪心】P2949WorkSchedulingG+P4053[JSOI2007]建筑抢修题解
    这两天遇到了几个很神奇的题目——能反悔的贪心。赶紧记录一下。例1(用时一定模型)用时一定:每个任务完成的耗时都是一样的。题面:Luogu-P2949WorkSchedulingG大体思路是:先把所有任务按照截止时间从小到大排序,然后枚举,遇到一个能做任务的就把他做了,把他的贡献加入一个......
  • 昇思25天学习打卡营第20天|K近邻算法实现红酒聚类
    这节课主要学习使用MindSpore在部分wine数据集上进行KNN实验。目标是了解KNN的基本概念以及如何使用MindSpore进行KNN实验。1.K近邻算法原理介绍1.1K近邻算法(K-Nearest-Neighbor,KNN)是一种用于分类和回归的非参数统计方法,最初由Cover和Hart于1968年提出(Cover等人,196......
  • 【数据结构与算法】详解二叉树下:实践篇————通过链式结构深入理解并实现二叉树
          ......
  • 2024 暑假友谊赛 1
    2024暑假友谊赛1A-......
  • (2024最新) 自动发卡网站搭建教程 - 完全免费
    基于iDataRiver的发卡业务,商户可以10分钟内搭建一个属于自己的自动发卡网站。搭建完成后,你会得到一个这样的自动发卡网站之所以免费,是因为通过如Vercel这类第三方部署平台可以免服务器部署网站,对绝大多数商家来说,这是一个不错的开始,因为这些平台提供的免费计划足够一个小型发卡......
  • 2024暑假第二周总结
    运算符总结对字面量或者变量进行操作的符号算数运算符加减乘除取模取余加减乘publicclassyunsuanfu{publicstaticvoidmain(String[]args){//+System.out.println(3+2);//5//-System.out.println(3-2);//1//*......
  • 2024.07.06 hadoop学习
    这是暑假自学的第一周,在这里做一个周总结。自从考完试之后,数据库小学期也开始了,所以我在下午进行自学,这一周自学的内容是javaweb。这一周每天下午都会抽出一小时的时间学习,学习的主要内容是javaweb中的maven,连接数据库,进行CRUD开发。在学习maven的过程中,主要使用半成品框架......
  • 2024.07.13hadoop总结
    hadoop基础概念学习在这之前并不了解hadoop,甚至没怎么听人提起过,直到学习大数据技术需要hadoop和python才开始学习。               hadoop的概念还没有完全了解完全,但是它的核心是处理和存储大数据,需要在虚拟机上面进行系统的测试 ......