美文网首页
异常处理的反模式

异常处理的反模式

作者: 码代码的陈同学 | 来源:发表于2018-07-07 11:36 被阅读0次

欢迎访问 陈同学博客原文
Exception-Handling Antipatterns Blog from Oracle Community
Exception management antipatterns from Java Peanuts
《反模式-危机中软件、架构和项目的重构》by 宋锐 等译

异常设计实践 中有位读者评论:又记录日志又抛异常反模式设计。其实我并不知道反模式,本文是对于反模式的学习整理,数据都来自参考资料。

先岔开主题,BB两个小点:

  • 读者的一个评论,有时却能让笔者受益良多,这也是交流带来的好处,打破认知的局限。
  • 对于知识的学习经常是写小学作文的 总-分-总 模式。先知晓概念,然后碎片学习,最后整体总结,通过一个个小知识点的积累,最终不断丰富与深化自己知识框架。

关于反模式

设计模式的风靡,反映了软件从业人员对改善行业质量与标准的强烈愿望,因使用和创建可复用的设计模式而获得成功的项目不断增长,设计模式体验了巨大的价值。

设计模式通俗来说就是 套路,来源于实践,反哺给实践。但实践中,也常因将设计模式应用于不适当的上下文环境而导致许多问题。

反模式 利用实践经验来定义经常发生的错误,让你留意开发过程中潜在的各种陷阱与风险。反模式描述了这些易错场景的基本形式、可能带来的负面影响,提供了补救措施,并给这些场景定义了名称。

更多关于反模式的知识,可以阅读《反模式-危机中软件、架构和项目的重构》。

异常处理反模式

此处仅挑选几个,更多请参考 Exception-Handling Antipatterns Blog

Log and Throw

下面是三个讨厌的反模式,既打印日志又抛出异常,这对于运维工程师来说简直就是噩梦,因为一个问题产生了多种log信息。

例1:

catch (NoSuchMethodException e) { LOG.error("Blah", e); throw e; }

例2:

catch (NoSuchMethodException e) { 
    LOG.error("Blah", e); throw new MyServiceException("Blah", e); 
}

例3:

catch (NoSuchMethodException e) { 
    e.printStackTrace(); throw new MyServiceException("Blah", e); 
}

Throwing Exception

public void foo() throws Exception {}

直接抛出 异常基类 完全打破了 checked exeption 的目的,这样做就是在向你的调用者宣布:我可能会干点坏事,你悠着点

Catching Exception

try { foo(); } catch (Exception e) { LOG.error("Foo failed", e); }

这是"私吞"异常的例子,也是异常处理中不可饶恕的 恶行,异常从此凭空消失,只有这条淹没在日志汪洋中的傻乎乎的日志是唯一线索。

Destructive Wrapping

catch (NoSuchMethodException e) { throw new MyServiceException("Blah: " + e.getMessage()); }

这种破坏性包装导致原始异常的stack trace丢失,出现异常时大家一起来抓瞎,再抓个实习生顶锅。

Return null

下面三个例子都返回null值,除非特殊的业务场景需要返回null值,否则最好抛出异常,让调用者进行处理。

catch (NoSuchMethodException e) { LOG.error("Blah", e); return null; }
catch (NoSuchMethodException e) { e.printStackTrace(); return null; } 
catch (NoSuchMethodException e) { return null; }

Throw from Within Finally

try { blah(); } finally { cleanUp(); }

如果 cleanUp() 永远不会抛异常倒还好,因为如果 blah() 出错,将进入 finnaly,可一旦 cleanUp() 出错,将丢失 blah() 中抛出的异常,同时需要处理 finally 中的异常。

Relying on getCause()

catch (MyException e) { if (e.getCause() instanceof FooException) {}

依赖 getCause() 的代码非常脆弱,这种方式不一定能捕获到真正的异常。推荐使用 Apache的 commons-lang 中的 ExceptionUtils.getRootCause() 来代替。

相关文章

  • 异常处理的反模式

    欢迎访问 陈同学博客原文Exception-Handling Antipatterns Blog from Ora...

  • Python基础-day14

    list ​ 枚举 ​ 异常 ​ 异常处理 ​ 自定义异常 ​ 单例设计模式(23设计模式 ...

  • 异常处理(二)--java19(22/12/2015)

    二、如何处理Exception的异常java提供的是异常处理的抓抛模式1."抛":当我们执行代码时,一旦出现异常,...

  • Scala模式匹配及偏函数

    模式匹配公式: 一、代码Demo 二、Scala中的模式匹配处理异常 三、Scala函数

  • [译] ARMv8-A架构基础之改变异常级别

    之前版本的ARM架构定义了基于处理器模式的异常模型。 对于每种异常类型,体系结构都定义了异常所采用的模式。 这种模...

  • PHP-MYSQL 学习笔记

    PHP连接数据库 PDO: 静默模式(default)/警告模式/异常模式 处理PDO静默模式 需要用 “===”...

  • JavaScript——异常处理&严格模式

    严格模式不仅仅是一个子集:它的产生是为了形成与正常代码不同的语义。 不支持严格模式与支持严格模式的浏览器在执行严格...

  • 入门(七)异常处理和IO

    1、异常处理 语法 (1)、示例 2、自定义异常 3、IO操作 (1)、文件读写 模式介绍 (2)、文件读写的简写...

  • python工厂模式和异常处理

    工厂模式 两个类A和B之间的关系应该仅仅是A创建B或 是A使用B,而不能两种关系都有 将对象的创建和使用分离,也使...

  • 策略模式处理不同邮箱异常

    顶层策略接口 qq邮箱异常处理策略 outlook邮箱处理策略 新增的网易邮箱异常处理策略 策略上下文 邮箱类型枚...

网友评论

      本文标题:异常处理的反模式

      本文链接:https://www.haomeiwen.com/subject/xefwuftx.html