zoukankan      html  css  js  c++  java
  • [六字真言]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做日志

    感觉如何?

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





  • 相关阅读:
    [UVa514] Rails
    今日才真正懂了BFS
    [UVa11292] Dragon of Loowater
    [UVa] TEX Quotes
    白书杂七杂八
    [OpenJudge] Feed_Accounting
    [OpenJudge] Jolly_Jumpers
    Restart
    Collection of Websites
    Oracle11完全卸载方法
  • 原文地址:https://www.cnblogs.com/pangxiansheng/p/458f3bcea3d97ff98be912cfd2139d90.html
Copyright © 2011-2022 走看看