Угловой обработчик ошибок включает компонент в комплекте

У меня есть обработчик ошибок, который выглядит так:

@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;
  }
}

Я получил это от: Глобальная обработка ошибок 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

Но когда в производстве используются угловые кли: ng build --prod --aot

Выход для той же ошибки:

свойство 'toString' из неопределенного TypeError: Невозможно прочитать свойство 'toString' из неопределенного в e._next ( 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 в каждом месте моего кода, я мог бы выдать ошибку определенного типа, но в тех местах, где нет блока try catch??

Stacktrace всегда должен показывать компонент, ответственный за ошибку, а не просто показывать tostring undefined в комплекте!

1 ответ

Решение

Причина, по которой вы получаете это при запуске команды ng build --prod --aot,

сборки используют связывание и ограниченную тряску деревьев, в то время как сборки --prod также выполняют ограниченное удаление мертвого кода через UglifyJS.

Вкратце - все журналы ошибок сводятся к минимуму, поэтому размер пакета уменьшается: это одна из причин, по которой мы получаем расширенное сообщение об ошибке в производственной сборке.

Чтобы этого не произошло, вы можете использовать эту команду, но только во время тестирования ng serve --aot или же ng serve --prod проверить на наличие ошибок как

Компилятор AOT обнаруживает и сообщает об ошибках привязки шаблона на этапе сборки, прежде чем пользователи смогут их увидеть.

Другие вопросы по тегам