【问题标题】:How to intercept all errors in a class instance?如何拦截类实例中的所有错误?
【发布时间】:2020-10-19 08:58:26
【问题描述】:

假设我有课

class Foo {
  doSomething() { throw 'error'; }
  doOtherthing() { throw 'error2'; }
  handleError(e) {}
}

是否有任何实现可以自动拦截/捕获此类中发生的任何错误并将其重定向到错误处理方法,在本例中为handleError()

例如

const foo = new Foo()
foo.doSomething() 

这应该触发errorHandler()。 Angular 有这样的实现,我不确定它是如何完成的。

【问题讨论】:

  • 没有 Javascript 类没有通用的 handleError 方法。 Angular 有这样的实现 angular 是框架而不是语言。
  • 那么如果我想制作一个具有这种能力的框架,有什么建议呢?
  • 是的,你可以这样做。如果你想知道如何,那很大程度上取决于这个“框架”是什么,它做什么以及它是如何工作的。最终,这就像在顶层添加 try {} catch{} 一样简单
  • 您可以建议任何实施方向吗?从角度来看,框架中发生的任何错误都可以使用已注册的 ErrorHandler 捕获。据我了解,try catch 可能适用于初始化。初始化后发生的其他方法调用呢?应该编写一个模式来实现这一点。
  • 我们已经在这里得到了相当合理的答案

标签: javascript error-handling


【解决方案1】:

您可以系统地wrap 错误处理包装器中的每个方法:

for (const name of Object.getOwnPropertyNames(Foo.prototype))
  const method = Foo.prototype[name];
  if (typeof method != 'function') continue;
  if (name == 'handleError') continue;
  Foo.prototype.name = function(...args) {
    try {
      return method.apply(this, args);
    } catch(err) {
      return this.handleError(err, name, args);
    }
  };
}

请注意,这意味着handleError 应该重新抛出异常,或者能够为类的所有方法返回结果(当然可以是undefined)。

对于异步方法,您需要检查返回值是否是一个承诺,然后在返回之前使用.catch() 附加一个错误处理程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2011-08-04
    • 2011-06-11
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多