Angular:将路由解析器中的异常传播到自定义全局错误处理程序的正确方法

时间:2019-01-16 09:47:58

标签: angular typescript error-handling

我有简单的路由解析器:

@Injectable()
export class DeviceResolver {
    constructor(private deviceService: DevicesService) {}

    resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        const id = +route.params['id'];
        if (id === 0) {
            return {};
        }
        const promise = this.deviceService.getDevice(id).toPromise()
        .then(
          data => Promise.resolve()
        ).catch(
          error =>  {
            console.log('[DeviceResolver]', error);
            throw error;
          }
        );

        return promise;
    }
}

和简单的全局自定义错误处理程序:

@Injectable()
export class ErrorsHandler implements ErrorHandler {
    handleError(error: any) {
        // Log the error anyway
        console.log(error);
    }
}

如果解析器中发生异常,则将执行promise的catch处理程序并在控制台中进行打印:

[DeviceResolver] HttpErrorResponse {headers: HttpHeaders,...

很好。这是HttpErrorResponse中的对象实例。

但是在ErrorsHandler中,控制台输出为:

Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},

为什么原始异常已被捕获并包装在另一个Error对象中? 如何在全局错误处理程序中拥有原始异常?

请注意,这仅在解析器中发生。如果我使用来自组件的直接服务调用,则会引发异常并将其正确传播到全局错误处理程序。

0 个答案:

没有答案