Angular errorhandler包含aot bundle上的组件

时间:2017-09-16 03:27:57

标签: angular error-handling angular2-aot angular-aot

我有一个错误处理程序,如下所示:

@Injectable() export class GlobalErrorHandler implements ErrorHandler {
constructor(private injector: Injector) { }
handleError(error) {
    const errorService = this.injector.get(ErrorService);
    const location = this.injector.get(LocationStrategy);

const url = location instanceof PathLocationStrategy
? location.path() : '';

StackTrace.fromError(error).then(stackframes => {
    const stackString = stackframes
      .splice(0, 20)
      .map((sf) => {
        return sf.toString();
      }).join('\n');

    const errorObject: IError = {
        errorMessage: error.messagen,
        stackTrace: stackString,
        path: url
    };

    // Display something to user
    errorService.setError(errorObject);

    // TODO: send to server
});

 // IMPORTANT: Rethrow the error otherwise it gets swallowed
 throw error;
  }
}

我从Global error handling angular 2

得到了这个

我的问题是,当我在开发中运行它时,它会按预期的方式使用包含组件的有意义的堆栈跟踪:

例如:

  

ngOnInit()@webpack:///src/app/person/userdetail-page/userdetail-page.component.ts:29:19   __tryOrSetError()@ webpack:///~/rxjs/Subscriber.js:247:0 this .__ tryOrSetError()@ webpack:///~/rxjs/Subscriber.js:187:0   _next()@ webpack:///~/rxjs/Subscriber.js:125:0 next()@ webpack:///~/rxjs/Subscriber.js:89:0   notifyNext()@webpack:///~/rxjs/operator/switchMap.js:124:0

但是在使用angular cli进行制作时:ng build --prod --aot

输出的相同错误是:

  

未定义的属性'toString'TypeError:无法读取属性   在e._next中未定义的'toString'   (http://xxx.azurewebsites.net/main.b21b245638698421733f.bundle.js:1:5701)   在e .__ tryOrSetError   (http://xxx.azurewebsites.net/vendor.1cd9b81fc017fd7eac16.bundle.js:835:16880)   在e.next

所以这对我来说不是一个有意义的堆栈跟踪。如果我可以在我的开发环境中得到导致问题的组件,为什么?!

您如何处理生产站点中的错误?如果我会尝试在我的代码中的每个地方捕获,我可以抛出特定类型的错误,但在没有尝试catch块的地方??

Stacktrace应该始终显示负责该错误的组件,而不仅仅是在bundle中显示未定义的tostring!

1 个答案:

答案 0 :(得分:0)

你得到这个的原因是在运行命令ng build --prod --aot时。

构建使用捆绑和有限的树抖动,而--prod构建也通过UglifyJS运行有限的死代码消除。

简而言之 - 缩小所有错误日志以减少捆绑包大小i:e是我们在生成版本中获取uglified错误消息的原因之一。

为了不发生这种情况,您可以使用此命令但仅在测试ng serve --aotng serve --prod时检查是否有任何错误

  

AOT编译器检测并报告模板绑定错误   用户可以看到它们之前的构建步骤。