代码之家  ›  专栏  ›  技术社区  ›  Adam

我是否可以自定义角度全局错误处理程序,使其不只是一个错误参数?

  •  1
  • Adam  · 技术社区  · 6 年前

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

    catchError(this.handleError(my, params, go, here)) 很多。

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

    handleError 方法,它与RxJS的 catchError 通过(1)将其记录到记录器(2)将其记录到控制台和(3)返回一个虚拟对象来处理错误 Observable 以便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() ,并像其他服务一样到处注入,但这似乎很笨拙。

    1 回复  |  直到 6 年前
        1
  •  1
  •   user4676340 user4676340    6 年前

    如果您能够使类脱离角度上下文,那么可以为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
  •  0
  •   Max Tomasello    6 年前

    首先,handleError方法返回void。在这里,您希望使用()方法返回一个可观察的。

    其次,您应该考虑到GlobalErrorHandler中的handleError方法不仅会对HttpErrorResponses执行,还会对应用程序中出现的任何错误执行(例如,除法为零)。当你的应用程序中出现除零或任何其他不可预见的错误时,为什么会返回并可观察到?

    Http interceptor interface

    Logging with http interceptors

    Intercepting http requests

    让mw知道事情的进展。否则我可以给你更多的指导。

    最好的 最大值。