我正在尝试在解析器中抛出自定义错误,这些错误是我使用全局错误处理程序捕获的。我可以在组件中抛出错误,并且可以很好地解决错误,但是当我在解析器中抛出错误时,它们的类型将更改为标准Error
类型。
这是一个正常运作的复制品: https://stackblitz.com/edit/angular-gitter-vvgys6
设置
class DisplayableError extends Error {
// ...
}
@Injectable()
export class GlobalErrorHandlerService {
constructor() { }
handleError(error) {
console.log('GOT ERROR instance of DisplayableError', error instanceof DisplayableError);
}
}
工作习惯
在任何组件中,我都可以抛出一个错误,该错误被捕获在全局错误处理程序中,并且是DisplayableError
的实例。
throw new DisplayableError('blah');
破损用法
当我在解析器中抛出错误时,实例类型将更改为Error
,而instanceof DisplayableError
返回false。
@Injectable()
export class StoreGetResolver implements Resolve<StoreModel> {
constructor(
private storeService: StoreService,
) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<StoreModel> {
let storeId = route.paramMap.get('storeId');
return this.storeService.get(storeId)
.catch(error => Observable.throw(new DisplayableError('my custom error')));
}
}
我也尝试过
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<StoreModel> {
let storeId = route.paramMap.get('storeId');
return this.storeService.get(storeId)
.do(
() => { },
error => throw new DisplayableError('my custom error')
);
}
...甚至是这个
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<StoreModel> {
throw new DisplayableError('my custom error');
}
使用正确的数据调用DisplayableError的构造函数,并且消息甚至将其传递给全局错误处理程序,但是错误到达的类型是Error
而不是DisplayableError
类型>
答案 0 :(得分:2)
这是打字稿的一个已知问题:https://github.com/Microsoft/TypeScript/issues/13965
解决方法是对原型进行一些摆弄:
// Use this class to correct the prototype chain.
export class MyError extends Error {
__proto__: Error;
constructor(message?: string) {
const trueProto = new.target.prototype;
super(message);
// Alternatively use Object.setPrototypeOf if you have an ES6 environment.
this.__proto__ = trueProto;
}
}