Angular 6解析器中引发的错误将丢失错误自定义类型

时间:2018-07-25 00:29:43

标签: angular error-handling rxjs angular6

我正在尝试在解析器中抛出自定义错误,这些错误是我使用全局错误处理程序捕获的。我可以在组件中抛出错误,并且可以很好地解决错误,但是当我在解析器中抛出错误时,它们的类型将更改为标准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类型

1 个答案:

答案 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;
    }
}