我尝试创建一个自定义的全局ErrorHandler,并遵循详细的这里指令。
application-error-handler (只是重要的部分)
@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;
} application-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永远不会解析为true。
我不知道为什么和怎么会发生这种事。我看到的是错误被包装,所以我假设是因为当我调试时我看到了error: Error: [object: Object] at viewWrappedDebugError (vendor.bundle.js)
你知道是什么导致了这个问题吗?我怎么能解决它?
编辑,因为怀疑它与Debugmode有关。一旦我在enableProdMode();中启用了prodmode,它就会像预期的那样工作。
不过,这还没有真正回答我的问题。
如何处理角度调试模式下的自定义错误?
发布于 2017-05-22 11:19:42
您会遇到这个问题,因为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中未捕获的承诺
另一种错误情况是,当您从由角度生命周期调用的方法(例如:处理程序,生命周期钩子)中返回被拒绝的承诺时。
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);
}
}https://stackoverflow.com/questions/44108285
复制相似问题