加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

角度6解析器中抛出的错误会丢失错误自定义类型

发布时间:2020-12-17 17:11:36 所属栏目:安全 来源:网络整理
导读:我试图在我的全局错误处理程序捕获的解析器中抛出自定义错误.我可以在一个组件中抛出错误并且它们可以很好地完成,但是当我将它们放入解析器时,它们的类型将更改为标准的错误类型. 这是一个功能正常的复制品: https://stackblitz.com/edit/angular-gitter-vv
我试图在我的全局错误处理程序捕获的解析器中抛出自定义错误.我可以在一个组件中抛出错误并且它们可以很好地完成,但是当我将它们放入解析器时,它们的类型将更改为标准的错误类型.

这是一个功能正常的复制品:
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

解决方法

这是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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读