我有简单的路由解析器:
@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对象中? 如何在全局错误处理程序中拥有原始异常?
请注意,这仅在解析器中发生。如果我使用来自组件的直接服务调用,则会引发异常并将其正确传播到全局错误处理程序。