函数式编程之命令式异常处理

141 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

背景故事

在JavaScript开发过程中会碰到各种各样的错误,例如说类型错误、语法错误等等,甚至打开现在的一些知名的网站的控制台依然可以看到一系列的错误信息。由于这些错误并不影响程序的运行或者只有非常规模式下才会出现,所以有些错误我们基本上是视而不见的。

在我们业务开发过程中,导致这些错误发生的情况有很多:

  1. 最容易出现的JavaScript错误是在与服务端通信的时候,由于服务端或者业务调整导致服务端返回数据结构发生变动或者是直接返回null;

  2. 使用的第三方库的姿势不对或者是第三方库处理特殊场景时抛出异常信息;

这时候有经验的老司机就会使用try-catch进行容错处理,以防止程序出现预期之外的情况。

try-catch处理异常

当对于某段代码可能存在异常情况的时候,我们可以通过try-catch语句将代码包裹起来。当程序运行过程中发生异常的时候,JavaScript会立即停止try中代码块的执行,并生成一个错误信息抛出到catch中

当try中包裹的异步代码执行过程中,catch捕获不到抛出的异常信息。

    try {
      ...
      throw new Error('error');
      ...
    } catch (error) {
      console.error(error);
    }

但是,当使用try-catch后,代码将无法进行抽象或者组合连接,这将使代码设计不够完美。

抛出异常的蝴蝶效应

在JavaScript中抛出异常之后,除了会影响代码设计,还会产生其它的不良影响:

  • 产生副作用。前面我们聊纯函数的时候说起过,尽量的在业务开发过程中使用纯函数减少副作用的产生。
  • 导致业务耦合。业务开发过程中,开发者没有关注函数的异常情况,导致需要在catch中进行业务处理,最终引发业务耦合。
  • 代码嵌套。如果在catch中进行异常处理,会导致try-catch进行嵌套。
    try {
      ...
      throw new Error('error');
      ...
    } catch (error) {
      try {
          ...
          console.log(error);
      } catch (error) {
          ...
      }
    }

难道我们要禁止在JavaScript程序中抛出异常吗?

这其实是不现实的。先不说我们业务开发过程中能不能完全实现,单单是第三库中的异常处理我们就无法控制。总不能说,如果有个相当好用的第三方依赖库有异常抛出我们就不使用了吧?

对于错误异常处理其实是有利也有弊。我们要合理的使用异常捕获,而不是滥用。

尾语

既然开发过程中势必要有异常抛出,而try-catch有不够优雅,那么我们肯定就要探索更加优雅的处理方式来解决异常。后续我们就会深入的寻找一下更好的异常解决方案。

好了,有关异常处理的基本内容到这里就结束了,欢迎大家在下方留言交流。