首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角4,自定义ErrorHandler不识别自定义错误

角4,自定义ErrorHandler不识别自定义错误
EN

Stack Overflow用户
提问于 2017-05-22 08:38:14
回答 1查看 17.2K关注 0票数 10

我尝试创建一个自定义的全局ErrorHandler,并遵循详细的这里指令。

application-error-handler (只是重要的部分)

代码语言:javascript
复制
@Injectable()
export class ApplicationErrorHandler extends ErrorHandler {

    constructor(private injector: Injector) {
        super(false);
    }

    handleError(error: any): void {

        if (error instanceof ApplicationError || error.originalError instanceof ApplicationError) {
            this.addError(error.originalError);
        }
        else {
            super.handleError(error);
        }
    }

应用程序-模块

代码语言:javascript
复制
 providers: [
    {
        provide: ErrorHandler,
        useClass: ApplicationErrorHandler
    }
],

app.component (唯一重要的部分)

代码语言:javascript
复制
public ngOnInit(): void { 
    const error = new ApplicationError();
    error.message = "fehler";
    throw error;
} 

application-error

代码语言:javascript
复制
export class ApplicationError implements Error {
    name: string;
    message: string;
    httpStatus?: number = 404;
    applicationStatus?: number;
    errorMessageTranslationkey: string;
    handled: boolean = false;
}

在我的app.component中,我抛出一个ApplicationError (在ngOnInit中),成功地调用了我的ErrorHandler。但是我在handleError中的错误总是Error类型,而error.originalError总是undefined,不管我抛出自定义错误,在那里if永远不会解析为true。

我不知道为什么和怎么会发生这种事。我看到的是错误被包装,所以我假设是因为当我调试时我看到了error: Error: [object: Object] at viewWrappedDebugError (vendor.bundle.js)

你知道是什么导致了这个问题吗?我怎么能解决它?

编辑,因为怀疑它与Debugmode有关。一旦我在enableProdMode();中启用了prodmode,它就会像预期的那样工作。

不过,这还没有真正回答我的问题。

如何处理角度调试模式下的自定义错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-22 11:19:42

您会遇到这个问题,因为ApplicationError不是Error

可以使用以下代码来创建自定义错误:

代码语言:javascript
复制
export class ApplicationError extends Error {

  httpStatus?: number = 404;
  applicationStatus?: number;
  errorMessageTranslationkey: string;
  handled: boolean = false;

  constructor(message?: string) {
    super(message);
    this.name = ApplicationError.name;
    Object.setPrototypeOf(this, ApplicationError.prototype);
  }
}

与创建自定义错误的主题相关,还请检查这些链接,以便对主题有一个完整的了解:

为什么需要这是一个错误实例?,因为您的错误通过以下方法:

代码语言:javascript
复制
function viewWrappedDebugError(err, context) {
    if (!(err instanceof Error)) {
        // errors that are not Error instances don't have a stack,
        // so it is ok to wrap them into a new Error object...
        err = new Error(err.toString());
    }
    _addDebugContext(err, context);
    return err;
}

代码可在errors.ts上使用。

因此,如果不抛出Error实例,则会创建一个新实例。

拦截ErrorHandler中未捕获的承诺

另一种错误情况是,当您从由角度生命周期调用的方法(例如:处理程序,生命周期钩子)中返回被拒绝的承诺时。

代码语言:javascript
复制
export class AppComponent implements OnInit {

  ngOnInit() {
    return new Promise((resolve, reject) => reject(new ApplicationError()));
  }
}

因此,错误处理代码可以如下所示:

代码语言:javascript
复制
import {ErrorHandler, Injectable, Injector} from "@angular/core";
import {ApplicationError} from "./ApplicationError";

@Injectable()
export class ApplicationErrorHandler extends ErrorHandler {

  private errors: ApplicationError[] = [];

  constructor(private injector: Injector) {
    super(false);
  }

  handleError(error: any): void {

    if (error instanceof ApplicationError) {
      this.addError(error);
    }
    else {
      if(error.rejection instanceof ApplicationError) {
        this.addError(error.rejection);
      }
      else {
        super.handleError(error);
      }
    }
  }

  addError(error: ApplicationError) {
    this.errors.push(error);
  }
}
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44108285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档