私の 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;
}