首页 > 代码库 > [六字真言]3.呢.异常的谎言,你要相信多少次?

[六字真言]3.呢.异常的谎言,你要相信多少次?

"嘛,呢",梵文意为“如意宝”,表示“宝部心”,又叫嘛呢宝,其实就是有"聚宝"的意思!
现在的社会现在的人,都是喜欢虚的假的,不喜欢真的诚的,谁虚伪谁高人一等,谁真诚谁傻瓜一个,这句话很现实的,会做的不如会说的.
这就是现实,真情可贵,用心陪醉,虚伪面对,从容领会,我就是永远都学不会
不知道最近心是怎么样了,周围发生了一些固有的定律,其实知道,只是不说!有的时候感觉大家都是聪明人,但是都在做不聪明的事情!

重复多次的"谎言"

有时开发的时候我们总不是单线条的去完成一些事情,会比较复杂.
如下情景:
定义了 2 个类 UserService 和 RoleService。其中 UserService 类中调用了 RolerService 类的代码,并且 UserService 类和 RoleService 类中都捕捉打印了异常.
代码如下

  1. public class UserService {
  2. //必须要使用这样的日志输出,不要使用system.out了
  3. private static Logger logger = LoggerFactory.getLogger(UserService.class);
  4. public void process(){
  5. try{
  6. //实例化 RoleService 类,可以换成其它注入等方式
  7. RoleService roleService = new RoleService();
  8. roleService.process();
  9. //other code might cause exception
  10. } catch(XXXException e){
  11. //如果 RoleService 类 process 方法抛出异常,异常会在 RoleService 类中被打印,在这里也会被打印,从而会打印 2 次
  12. logger.error(e);
  13. throw new RuntimeException(/* 错误代码 */ errorCode, /*异常信息*/msg, e);
  14. }
  15. }
  16. }
  17. public class RoleService{
  18. private static Logger logger = LoggerFactory.getLogger(RoleService.class);
  19. public void process(){
  20. try{
  21. //可能抛出异常的代码
  22. }
  23. catch(XXXException e){
  24. logger.error(e);
  25. throw new RuntimeException(/* 错误代码 */ errorCode, /*异常信息*/msg, e);
  26. }
  27. }
  28. }

"谎言"说一次就可以了,别把我们当成傻瓜!

同一段异常会被打印 2 次。如果层次再复杂一点,不去考虑打印日志消耗的系统性能,仅仅在异常日志中去定位异常具体的问题已经够头疼的了。

其实打印日志只需要在代码的最外层捕捉打印就可以了,异常打印也可以写成 AOP,织入到框架的最外层.

面试问题: 如果问道AOP的时候

  1. AOP的实现方式->Java的动态代理
  2. AOP的五种通知方式,并且要知道如何使用?
  3. AOP的你做过什么事情?日志的监控[登录日志/操作日志]

认清自己不容易

不管你再公司也好还是在生活中,都需要认清自己的定位
胖先生就是这样,有的时候对自己的定位不清楚,想要什么也不清楚!一直的浑浑噩噩吧!

一定记住,对于我们来说:出异常是最好的事情

异常不仅要能够让开发人员知道哪里出了问题,更多时候开发人员还需要知道是什么原因导致的问题,我们知道 java.lang.Exception 有字符串类型参数的构造方法,这个字符串可以自定义成通俗易懂的提示信息。

万能大法:java.lang.Exception

简单的自定义信息开发人员只能知道哪里出现了异常,但是很多的情况下,开发人员更需要知道是什么参数导致了这样的异常。这个时候我们就需要将方法调用的参数信息追加到自定义信息中。
下例只列举了一个参数的情况,多个参数的情况下,可以单独写一个工具类组织这样的字符串。
根据实际情况,来完成

  1. public void load(Long id){
  2. try{
  3. //..some code that throws SQLException
  4. }catch(SQLException ex){
  5. //将参数信息添加到异常信息中
  6. throw new RuntimeException(“Exception in load with Object Id :”+ id, ex);
  7. }
  8. }

与人方便自己方便

不可知的环境,请小心

如果你掌握了上面的技巧,那么算是入门了吧!慢慢来,路很长胖先生陪着你们走!虽然不知道能走多远.

  • 在写代码的过程中,由于对调用代码缺乏深层次的了解,不能准确判断是否调用的代码会产生异常[经验基础的积累],因而忽略处理。

  • 在产生了 Production Bug 之后才想起来应该在某段代码处添加异常补捉,甚至不能准确指出出现异常的原因。

  • 这就需要开发人员不仅知道自己在做什么,而且要去尽可能的知道别人做了什么,可能会导致什么结果,从全局去考虑整个应用程序的处理过程。这些思想会影响我们对代码的编写和处理。

加油吧!咱们一起来修炼吧!修炼什么功法?异常大法?
大胖说:减肥大法[哈哈,我喜欢,上面做的一切都能使用加肥大法的]
瘦子说:你就是懒而已!
大胖说:好吧!我懒!我承认!

减肥大法之乾坤大挪移

怎么说说减肥呢?胖先生是胖,都是悲哀啊!

用别人写好的东西为我所用,如今 Java 第三方日志库的种类越来越多,一个大项目中会引入各种各样的框架,而这些框架又会依赖不同的日志库的实现。

  1. 最麻烦的问题倒不是引入所有需要的这些日志库,问题在于引入的这些日志库之间本身不兼容。
  2. 如果在项目初期可能还好解决,可以把所有代码中的日志库根据需要重新引入一遍,或者换一套框架。
  3. 但这样的成本不是每个项目都承受的起的,而且越是随着项目的进行,这种风险就越大。

怎么样才能有效的避免类似的问题发生呢,现在的大多数框架已经考虑到了类似的问题,可以通过配置 Properties 或 xml 文件、参数或者运行时扫描 Lib 库中的日志实现类,真正在应用程序运行时才确定具体应用哪个特定的日志库。
其实,根据不需要多层次打印日志那条原则,我们就可以简化很多原本调用日志打印代码的类。很多情况下,

重点推荐:利用拦截器或过滤器实现日志的打印,降低代码维护、迁移的成本。
如果有spring推荐使用AOP做日志

感觉如何?

有一些人毕业了,我们还是常有联系!
有一些人即将毕业,请痛快的玩乐,最后的放纵
有一些人患得患失,别在乎那么多,你们还年轻,不努力,等什么呢?
有一些人惧怕未来,没事有胖先生陪你们
有一些人遗忘胖先生



来自为知笔记(Wiz)


[六字真言]3.呢.异常的谎言,你要相信多少次?