angular – 如何“解包”ZoneAwareError?

在我的Angular 2应用程序中,我有一个解决方案,它会尝试xhr并在失败时抛出自定义错误:

return this.service.getProduct (id)
    .catch (err => Observable.throw(new MyError(err.message, route, 500, err)));

MyError只是Error的扩展:

export class MyError extends Error {

    constructor(message, routeSnapshot, code, err) {
        super(message);
        this.name = 'MyError';
        this.routeSnapshot = routeSnapshot;
        this.code = code;
        this.err = err;
    }

}

我的全局错误处理程序接收ZoneAwareError而不是MyError的实例:

export class MyErrorHandler implements ErrorHandler {

    handleError(error) {
        console.log('handling err', error);
        // this prints a ZoneAwareError on the console
    }

}

错误真的应该包含在ZoneAwareError中吗?如何解开它以获取MyError?依赖error.rejection属性是否安全? (因为我可以看到MyError).

===编辑:

好吧,我刚刚发现Angular在错误的不同子类型中包装错误,而不仅仅是ZoneAwareError.到目前为止,我有这个功能打开它们,但感觉有点hacky:

function unwrap (err) {
    let res = err.rejection ? err.rejection : err;

    while (res.originalError) {
        res = res.originalError;
    }
    res.name = res.name || 'unknown';
    return res;
}
最佳答案
您可以看到Angular本身是如何进行展开的: angular/modules/@angular/core/src/error_handler.ts,但它们似乎没有以任何方式处理拒绝(这非常有用),所以我在展开之前使用以下内容:

    if(error.hasOwnProperty('rejection'))
    {
        error = error.rejection;
    }

zone.js中的UncaughtPromiseError接口

转载注明原文:angular – 如何“解包”ZoneAwareError? - 代码日志