范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Java异常处理实践

  不要忽略捕捉的异常 catch (NoSuchMethodException e) {     return null;  }
  虽然捕捉了异常但是却没有做任何处理,除非你确信这个异常可以忽略,不然不应该这样做。这样会导致外面无法知晓该方法发生了错误,无法确定定位错误原因。 在你的方法里抛出定义具体的检查性异常 public void foo() throws Exception { //错误方式  }
  一定要避免出现上面的代码示例,它破坏了检查性异常的目的。 声明你的方法可能抛出的具体检查性异常,如果只有太多这样的检查性异常,你应该把它们包装在你自己的异常中,并在异常消息中添加信息。 如果可能的话,你也可以考虑代码重构。  public void foo() throws SpecificException1, SpecificException2 { //正确方式  }捕获具体的子类而不是捕获 Exception 类 try {     someMethod();  } catch (Exception e) { //错误方式     LOGGER.error("method has failed", e);  }
  捕获异常的问题是,如果稍后调用的方法为其方法声明添加了新的检查性异常,则开发人员的意图是应该处理具体的新异常。如果你的代码只是捕获异常(或 Throwable),永远不会知道这个变化,以及你的代码现在是错误的,并且可能会在运行时的任何时候中断。 永远不要捕获 Throwable 类
  这是一个更严重的麻烦,因为 Java Error 也是 Throwable 的子类,Error 是 JVM 本身无法处理的不可逆转的条件,对于某些 JVM 的实现,JVM 可能实际上甚至不会在 Error 上调用 catch 子句。 始终正确包装自定义异常中的异常,以便堆栈跟踪不会丢失 catch (NoSuchMethodException e) {     throw new MyServiceException("Some information: " + e.getMessage());  //错误方式  }
  这破坏了原始异常的堆栈跟踪,并且始终是错误的,正确的做法是:  catch (NoSuchMethodException e) {     throw new MyServiceException("Some information: " , e);  //正确方式  }复要么记录异常要么抛出异常,但不要一起执行 catch (NoSuchMethodException e) {    //错误方式      LOGGER.error("Some information", e);     throw e;  }
  正如上面的代码中,记录和抛出异常会在日志文件中产生多条日志消息,代码中存在单个问题,并且对尝试分析日志的同事很不友好。 finally 块中永远不要抛出任何异常 try {    someMethod();  //Throws exceptionOne  } finally {    cleanUp();    //如果finally还抛出异常,那么exceptionOne将永远丢失  }
  只要 cleanUp() 永远不会抛出任何异常,上面的代码没有问题,但是如果 someMethod() 抛出一个异常,并且在 finally 块中,cleanUp() 也抛出另一个异常,那么程序只会把第二个异常抛出来,原来的第一个异常(正确的原因)将永远丢失。如果在 finally 块中调用的代码可能会引发异常,请确保要么处理它,要么将其记录下来。永远不要让它从 finally 块中抛出来。 始终只捕获实际可处理的异常 catch (NoSuchMethodException e) {     throw e; //避免这种情况,因为它没有任何帮助  }
  这是最重要的概念,不要为了捕捉异常而捕捉,只有在想要处理异常时才捕捉异常,或者希望在该异常中提供其他上下文信息。如果你不能在 catch 块中处理它,那么最好的建议就是不要只为了重新抛出它而捕获它。 不要使用 printStackTrace() 语句或类似的方法
  完成代码后,切勿忽略 printStackTrace(),最终别人可能会得到这些堆栈,并且对于如何处理它完全没有任何方法,因为它不会附加任何上下文信息。 对于不打算处理的异常,直接使用 finally try {    someMethod();  //Method 2  } finally {    cleanUp();    //do cleanup here  }
  这是一个很好的做法,如果在你的方法中你正在访问 Method 2,而 Method 2 抛出一些你不想在 Method 1 中处理的异常,但是仍然希望在发生异常时进行一些清理,然后在 finally 块中进行清理,不要使用 catch 块。 记住早 throw 晚 catch 原则
  这可能是关于异常处理最著名的原则,简单说,应该尽快抛出(throw)异常,并尽可能晚地捕获(catch)它。应该等到有足够的信息来妥善处理它。
  这个原则隐含地说,你将更有可能把它放在低级方法中,在那里你将检查单个值是否为空或不适合。而且你会让异常堆栈跟踪上升好几个级别,直到达到足够的抽象级别才能处理问题。 在异常处理后清理资源
  如果你正在使用数据库连接或网络连接等资源,请确保清除它们。如果你正在调用的 API 仅使用非检查性异常,则仍应使用 try-finally 块来清理资源。 在 try 模块里面访问资源,在 finally 里面最后关闭资源。即使在访问资源时发生任何异常,资源也会优雅地关闭。 只抛出和方法相关的异常
  相关性对于保持应用程序清洁非常重要。一种尝试读取文件的方法,如果抛出 NullPointerException,那么它不会给用户任何相关的信息。相反,如果这种异常被包裹在自定义异常中,则会更好。NoSuchFileFoundException 则对该方法的用户更有用。 切勿在程序中使用异常来进行流程控制
  不要在项目中使用异常来处理应用程序逻辑。永远不要这样做,它会使代码很难阅读和理解。 尽早验证用户输入以在请求处理的早期捕获异常
  始终要在非常早的阶段验证用户输入,甚至在达到 controller 之前,它将帮助你把核心应用程序逻辑中的异常处理代码量降到最低。如果用户输入出现错误,还可以保证与应用程序一致。
  例如:如果在用户注册应用程序中,遵循以下逻辑: 验证用户 插入用户 验证地址 插入地址 如果出问题回滚一切
  这是不正确的做法,它会使数据库在各种情况下处于不一致的状态,应该首先验证所有内容,然后将用户数据置于 dao 层并进行数据库更新。正确的做法是: 验证用户 验证地址 插入用户 插入地址 如果问题回滚一切 一个异常只能包含在一个日志中 LOGGER.debug("Using cache sector A");  LOGGER.debug("Using retry sector B");复制代码
  不要像上面这样做,对多个  LOGGER.debug()   调用使用多行日志消息可能在你的测试用例中看起来不错,但是当它在具有 100 个并行运行的线程的应用程序服务器的日志文件中显示时,所有信息都输出到相同的日志文件,即使它们在实际代码中为前后行,但是在日志文件中这两个日志消息可能会间隔 100 多行。应该这样做: LOGGER.debug("Using cache sector A, using retry sector B");复制代码将所有相关信息尽可能地传递给异常
  有用的异常消息和堆栈跟踪非常重要,如果你的日志不能定位异常位置,那要日志有什么用呢? 终止掉被中断线程 while (true) {    try {      Thread.sleep(100000);    } catch (InterruptedException e) {} //别这样做    doSomethingCool();  }
  InterruptedException 异常提示应该停止程序正在做的事情,比如事务超时或线程池被关闭等。
  应该尽最大努力完成正在做的事情,并完成当前执行的线程,而不是忽略 InterruptedException。修改后的程序如下:  while (true) {    try {      Thread.sleep(100000);    } catch (InterruptedException e) {      break;    }  }  doSomethingCool();对于重复的 try-catch,使用模板方法
  在代码中有许多类似的 catch 块是无用的,只会增加代码的重复性,针对这样的问题可以使用模板方法。
  例如,在尝试关闭数据库连接时的异常处理。  class DBUtil{      public static void closeConnection(Connection conn){          try{              conn.close();          } catch(Exception ex){              //Log Exception - Cannot close connection          }      }  }
  这类的方法将在应用程序很多地方使用。不要把这块代码放的到处都是,而是定义上面的方法,然后像下面这样使用它:  public void dataAccessCode() {      Connection conn = null;      try{          conn = getConnection();          ....      } finally{          DBUtil.closeConnection(conn);      }  }使用 JavaDoc 中记录应用程序中的所有异常
  把用 JavaDoc 记录运行时可能抛出的所有异常作为一种习惯,其中也尽量包括用户应该遵循的操作,以防这些异常发生。 参考与来源:
  https://blog.csdn.net/fuzhongmin05/article/details/77600410
  https://juejin.im/post/6844903981299433479

iphone来电显示归属地错乱苹果手机在我们日常生活当中已经被很多人使用,然而在使用过程当中肯定也会有一些错误的出现。在接到来电的时候号码归属地就是一个非常重要的信息,这可能会影响到我们的生活,那么苹果手机来电我是00后,我想问一下,周杰伦当年有多火?当年神仙打架的年代,周杰伦说要发新歌了,其他人同时期定好的都选择延期发行或者取消发行泣不成声歌神张学友,陈奕迅还有一众歌手去听他的现场演唱会,被大屏幕抓包时,周杰伦当场用自己歌的旋是不是该有个10万极CD机的选择?chaisan发表于20221242124天琴不符合楼主要求。其他随意。其实我听下来。感觉系统略松了些。可能是习惯了魔域的结实与速度。所以想往回折中一些。柴大有建议么?EMM老款分微软与Alphabet那只股回报会更好?关键点微软和Alphabet股价表现都在2021年优于大市两只股票仍被视为2022年的避风港科技股。但其中一只股票有点过热,而另一只相对于公司增长潜力仍然被低估。微软和Alphab蔚来宁王入局之后,吉利联手力帆进军万亿换电赛道来源中证报1月24日,吉利汽车发布公告称,与力帆科技(维权)订立协议成立的合资公司已完成工商注册登记手续,取得重庆两江新区市场监督管理局颁发的营业执照。合资企业名为重庆睿蓝汽车科技电商知识电商运营流程和工作流程一检查1促销特价店铺活动活动时间推广费库存主次爆款是否正常2活动时间和促销内容与店铺图片是否一致3库存各主次爆款库存是否充足,其他款量少的直接改实际库存,如果低于预警量跟采购确认是90地级市覆盖,服务中心遍布全国,OPPO售后是如何获得好评的?对于大多数人来说,手机一直都是生活中必不可少的重要设备,但在日常用机中,难免会出现意外磕碰手滑碎屏等或大或小的问题。正因如此,很多人除了会关注手机本身的品质之外,也非常在意品牌的服小熊电器打造特色小家电产品,高度契合年轻消费者需求近日,小熊电器电火锅DHGC06D1在升温速度温度均匀性防烫性能功率等方面测评均达A级要求,从众多产品中脱颖而出,荣获中国家用电器研究院好产品认证。此次荣誉的获得,再次肯定了小熊电孙正义投资重心从海外转回日本?软银愿景基金计划扩张日本团队财联社(上海编辑刘蕊)讯,据彭博报道,软银集团计划为旗下软银愿景基金扩大日本投资团队,增加员工并加大交易撮合力度。这意味软银的投资重心可能会悄然转移至日本国内。此前,创始人孙正义为中国智能制造正面临三大挑战!专家补短板同时增长板,要做到你能卡我,我也能卡你百度财经独家出品的展望2022大拐点时代?变局与机遇系列直播迎来第九场,本场直播的主题是从制造到智造探索中国制造业升级之路。参加此次直播解读的嘉宾包括清华大学未来实验室首席研究员马广告弹窗太流氓?送你3个方法,永久关闭电脑弹窗,亲测有效相信许多人在使用电脑时,对突如其来的弹窗广告非常反感!明明什么都没有做,却平白无故弹出来许多垃圾广告,今天就来教大家如何彻底有效地关闭广告弹窗,让电脑桌面瞬间清净!一开启高级阻止程
三星手机是怎样失去中国市场的?三星是如何失去中国市场的?三星的产品确实是不错。但是三星对中国市场的态度,让中国人无法接受,三星手机的电池门事件。因为手机电池爆炸。针对各个国家的态度完全不一样,对美国市场他可以下小米12PRO深度评测最强王炸,配置直逼iPhone,国产手机迎巅峰提起小米,很多人印象比较深的就是小米的数字系列。2011年8月16日,小米手机1正式发布,通过互联网的思维和方法,给国内手机市场扔下了一枚重磅炸弹,拥有无数钉子户的小米6这些都是很北京自动驾驶测试170台车安全行驶近400万公里16家测试主体170台车辆391万公里。昨天,北京市自动驾驶车辆道路测试报告(2021年)正式对外发布。随着我国自动驾驶产业发展从关键技术验证阶段进入产品和商业模式验证阶段,自动驾相约冰雪,一起来丨冬奥中的高校力量不惧超低温新能源汽车不再怕冷央视网消息围绕着绿色冬奥的总体目标,实现奥运期间的绿色交通是其中的重要环节,而在严寒环境当中使用新能源汽车,需要攻克诸多技术难题。针对第24届北京张家口冬奥赛场的低温严寒环境,北京互联网公司有多卷?网友吐槽福利只有开水随着互联网热潮的兴起,一方面程序员成了各大企业争抢的香饽饽,一方面大龄程序员又成了令人嫌弃的对象,特别是过了35岁以后的程序员,如果还只是一线码农,找工作着实是一个问题,从能力上讲2022年即将发布的手机!盘点网友投票选出的十大最受期待的机型这里是知科技app,如果觉得本文有用,欢迎点赞关注我。往期精彩回顾如何长时间保存重要数据?拒绝U盘,拒绝网盘马上就要过年了,压岁钱什么的都该有了,年终奖什么的也该有了!看着自己手里最前线创邻科技Galaxybase图数据库完成5万亿规模交易数据智能挖掘2021年11月底工信部印发十四五软件和信息技术服务业发展规划,明确提出突破大规模并行图数据处理关键技术,推动高性能数据库在金融电信能源制造等重点行业关键业务系统应用。图数据库作为快递巨头重金布局义乌市场累计投资已超百亿为何快递最低价会出现在义乌?这与当地发达的电商产业有着直接的关系。北下朱村,是义乌市近年新涌现出的电商重地,在很多义乌人眼中,如今的北下朱村风头已经盖过号称电商第一村的青岩刘村,被快递员派送费一件仅约1元钱快递价格战恶性循环?近日,浙江省通过了快递业促进条例(草案),其中规定快递经营者不得以低于成本的价格提供快递服务。而浙江省之所以出台这样的规定,则与近期的多家快递公司打起的价格战息息相关。1快递行业低华为手机业务被逼到极端困难,余承东坦言,高端市场让给了苹果比想象中还要困难,四轮制裁的压力让华为手机业务遭遇了极端困难,被逼上绝境的华为该如何应对呢?余承东更是坦言,自己在高端市场的份额被友商所瓜分。从正值巅峰到滑落低谷,华为手机业务短短中央政法委长安剑一次次拖拉扯皮,特斯拉责任何在?担当何在?来源中央政法委长安剑资料图(视觉中国)特斯拉再陷争议。19日,上海车展刚刚开幕,一名女子就站上红色特斯拉车顶,张开双臂对围观群众高喊特斯拉刹车失灵!特斯拉刹车失灵!几分钟后,女车主