【问题标题】:Can I customize Angular global error handler to take more than just an error parameter?我可以自定义 Angular 全局错误处理程序以获取更多的错误参数吗?
【发布时间】:2019-07-04 21:07:45
【问题描述】:

https://angular.io/api/core/ErrorHandler 之后,我可以覆盖全局错误处理程序来处理错误对象,并且我喜欢我可以声明自己的全局错误处理程序并将其导入任何我需要的地方的方式。

但是对于 RxJS,我经常使用 catchError(this.handleError(my, params, go, here))

我想将我的handleError() 方法全球化,并将其合并到我的全局错误处理程序中。但这看起来在技术上是不可能的。

这就是我的 handleError 方法所做的,它结合 RxJS 的 catchError 通过 (1) 将其记录到记录器 (2) 将其记录到控制台和 (3) 返回一个虚拟的 @987654326 来处理错误@让RxJS调用能够顺利完成。

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

  constructor(private messageService: MessageService) { }

  public handleError<T>(
    error: HttpErrorResponse, operation = 'operation', result?: T) {
    var errorMessage = '';
    if (error.error instanceof ProgressEvent) {
      errorMessage = `Client error occurred: ${error.message}`;
    } else {
      errorMessage = `Adam's error ${error.status}: ${error.message}`;
    }
    console.error(errorMessage);
    this.messageService.add(`${operation} failed: ${errorMessage}`);
    return of(result as T);
  }

}

作为全局错误处理程序,我怎样才能做到这一点?还是我应该采取不同的方法?我知道我可以创建一个 “错误服务” 来保存我的通用 handleError(),并像其他所有服务一样将其注入到任何地方,但这似乎很笨重。

【问题讨论】:

    标签: angular typescript error-handling rxjs


    【解决方案1】:

    如果你能够让你的类脱离 Angular 上下文,你可以为 RxJS 创建一个自定义操作符。这并不是您问题的真正解决方案,而是一种解决方法:如果没有其他人提供解决方案,请在万不得已时使用它:

    export function handleCustomError<T>(...args) {
      // Out of Angular's context, you should not have a dependency in your constructor
      const errorHandler = new GlobalErrorHandler();
      return catchError<T>(errorHandler.handleError(...args));
    }
    

    【讨论】:

      【解决方案2】:

      首先,handleError 方法返回 void。这里要使用of()方法返回一个Observable。

      其次,您应该考虑到 GlobalErrorHandler 中的 handleError 方法不仅会针对 HttpErrorResponse 执行,还会针对您应用程序中引发的任何错误(例如除以零)执行。当您的应用中发生除零或任何其他不可预见的错误时,为什么会返回和 Observable?

      我认为您的方法不正确。如果您想捕获来自您的 API 服务器的错误(我会假设)只是为了记录它并返回一个默认值,以便您的应用程序不会中断或任何事情,我会使用 http-interceptor。您可以在那里捕获任何错误,执行一些操作(记录)并再次将自定义值传递给链。

      Http interceptor interface

      Logging with http interceptors

      Intercepting http requests

      让 mw 知道进展如何。否则我可以提供更多指导。

      最好, 最大。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-21
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 2013-03-06
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多