一起聊聊angular中的ErrorHandler

本篇文章带大家了解一下angular中的异常处理errorhandler,通过例子介绍一下errorhandler的使用方法,希望对大家有所帮助!

一起聊聊angular中的ErrorHandler

ErrorHandler

ErrorHandler的默认实现将错误消息打印到 console。要拦截错误处理,请编写一个自定义的异常处理器,该异常处理器将把此默认行为改成你应用所需的。【相关教程推荐:《angular教程》】

以实际开发中一个例子演示使用方式:
假如前端有提出一个新需求为前端添加全局错误处理并上报错误日志,处理如下:

1、创建错误处理的error-handler.service.ts

import { HttpClient } from '@angular/common/http';import { ErrorHandler, Injectable } from '@angular/core';@Injectable()export class AppGlobalErrorhandler implements ErrorHandler {    constructor(private http:HttpClient){ }  // 当程序中出现异常时,会自动调用 handleError 钩子,可判断是客户端还是来自服务端的异常。  handleError(error) {  // 打印错处信息    console.warn("customize catch execption:" , error.stack);    // ...// 异常处理逻辑// ...    if(['ExpressionChangedAfterItHasBeenCheckedError'].every(item => !error.stack.includes(item))){    // 上报错误日志        this.http.post('/api/errorLog', {            url: location.href,            type: 'WEB',            error: error.stack,            message: error.toString()        }).subscribe()    }  }}

登录后复制

2、在app.module.ts中添加

import { AppGlobalErrorhandler } from './service/error-handler.service';...providers:  [... { provide: ErrorHandler, useClass: GlobalErrorHandler},...]

登录后复制

当程序中出现异常时,会自动调用handleError钩子,可判断是客户端还是来自服务端的异常。

3、在上面处理的是页面发生的异常,实际开发中同时也需要上报接口等的异常,当前使用的是ng-alain框架,所以在default.interceptor.ts拦截器中添加代码,具体参考:ng-alain—拦截网络请求

  private handleData(    event: HttpResponse | HttpErrorResponse,    data?:any  ): Observable {// 判断是否为错误实例    if (event instanceof HttpErrorResponse && event.url.indexOf('api/errorLog') === -1) {// 上报接口错误日志      this.http.post('/api/errorLog', {        url: event.url,        type: 'INTERFACE',        message: event.message,        status: event.status,        statusText: event.statusText,        param: JSON.stringify(data['body']||undefined),        body: JSON.stringify((event as any)['body'] || undefined),        error:JSON.stringify( event.error),      }).subscribe()    }    return of(event);  }// 拦截器  intercept(    req: HttpRequest,    next: HttpHandler,  ){    return next.handle(newReq).pipe(     // 当请求发生错误时,使用一个管道把错误发送给错误处理器      catchError((err: HttpErrorResponse) => this.handleData(err,newReq)),      mergeMap((event: any) => {        // 允许统一对请求错误处理,这是因为一个请求若是业务上错误的情况下其HTTP请求的状态是200的情况下需要        if (event instanceof HttpResponse && event.status === 200)          return this.handleData(event);        // 若一切都正常,则后续操作        return of(event);      }),    );  }

登录后复制

上面第3点的写法中的不是通过自动调用handleError钩子来处理错误的,在Interceptor拦截器中只能处理HttpErrorResponse类型的错误,如果这里处理了,那么ErrorHandler将捕获不到。所以在Interceptor中,如果一定要通过handleError钩子函数来处理错误,那么就需要将HttpErrorResponse类型的错误抛出。如下:

catchError((error: HttpErrorResponse) => {        if (error.status === 401) {          // 跳到登录页或者刷新token        } else {          return throwError(error);        } })

登录后复制

更多编程相关知识,请访问:编程视频!!

以上就是一起聊聊angular中的ErrorHandler的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2707282.html

(0)
上一篇 2025年3月7日 20:11:04
下一篇 2025年3月5日 03:44:42

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论