角度6解析器中抛出的错误会丢失错误自定义类型
发布时间:2020-12-17 17:11:36 所属栏目:安全 来源:网络整理
导读:我试图在我的全局错误处理程序捕获的解析器中抛出自定义错误.我可以在一个组件中抛出错误并且它们可以很好地完成,但是当我将它们放入解析器时,它们的类型将更改为标准的错误类型. 这是一个功能正常的复制品: https://stackblitz.com/edit/angular-gitter-vv
我试图在我的全局错误处理程序捕获的解析器中抛出自定义错误.我可以在一个组件中抛出错误并且它们可以很好地完成,但是当我将它们放入解析器时,它们的类型将更改为标准的错误类型.
这是一个功能正常的复制品: 建立 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 解决方法
这是Typescript:
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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |