我尝试创建自定义全局ErrorHandler并按照详细说明here
进行操作应用程序错误处理程序(只是重要部分)
@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);
}
}
应用模块
providers: [
{
provide: ErrorHandler,
useClass: ApplicationErrorHandler
}
],
app.component (只有重要部分)
public ngOnInit(): void {
const error = new ApplicationError();
error.message = "fehler";
throw error;
}
应用错误
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
永远无法解决为真。
我不知道为什么以及如何发生这种情况。
我所看到的是错误得到了,所以我认为,包装是因为我在调试时看到error: Error: [object: Object] at viewWrappedDebugError (vendor.bundle.js)
知道可能导致此问题的原因以及我如何解决它?
修改
怀疑它与Debugmode有关。只要我使用enableProdMode();
启用prodmode,它就会按预期工作。
但这还没有真正回答我的问题。
如何在角度调试模式下处理自定义错误?
答案 0 :(得分:17)
您遇到此问题是因为ApplicationError
不是Error
。
您可以使用以下代码创建自定义错误:
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);
}
}
与创建自定义错误的主题相关,请同时检查这些链接,以便对该主题有充分的了解:
为什么这需要成为错误的实例? 因为您的错误通过以下方法:
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中未捕获的承诺
另一个错误情况是从Angular生命周期调用的方法返回一个被拒绝的promise(例如:handler,lifecycle-hook)。
export class AppComponent implements OnInit {
ngOnInit() {
return new Promise((resolve, reject) => reject(new ApplicationError()));
}
}
因此,错误处理代码可能如下所示:
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);
}
}