code: function afterThrowing(functionToAdvise, afterThrowingAdvice) {
      return function afterThrowingAdvisedFunction(...args) {
          // constructor interception
          if (this instanceof afterThrowingAdvisedFunction) {
              let proxy = Object.create(functionToAdvise.prototype);
              try {
                  return applyConstructor(functionToAdvise, proxy, args);
              }
              catch (e) {
                  afterThrowingAdvice.call(proxy, e);
                  throw e;
              }
          }
  
          try {
              return functionToAdvise.apply(this, args);
          }
          catch (e) {
              afterThrowingAdvice.call(this, e);
              throw e;
          }
      };
  }
docs: 返回一个新的函数, 执行逻辑为, 在 functionToAdvise 函数抛出异常时, 执行 afterThrowingFunction,
  afterThrowingFunction 接收 functionToAdvise 抛出的异常对象作为唯一参数.
  通知不会吞噬原有异常, 会在afterThrowingFunction执行完毕后, 抛出原有异常.
  
  @param {Function} functionToAdvise 被拦截函数
  @param {Function} afterThrowingAdvice 被拦截函数抛出异常后的执行函数
  @return {Function} 组装了拦截功能后的函数