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。これまでのところ、それらをアンラップするこの関数がありますが、少しハッキーに感じます:

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