5

在我的 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
    }

}

真的error应该被包裹ZoneAwareError吗?我如何打开它才能MyError回来?依赖error.rejection房产安全吗?(因为我可以看到MyError那里)。

=== 编辑:

好的,我刚刚发现 Angular 将错误包装在不同的子类型中Error,而不仅仅是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;
}
4

1 回答 1

4

您可以看到 Angular 本身是如何展开的:angular/modules/@angular/core/src/error_handler.ts,但是它们似乎没有以rejection任何方式处理(这非常有用)所以我在展开之前使用以下内容:

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

zone.js 中的UncaughtPromiseError接口。

于 2017-02-06T20:15:59.993 回答