2017-09-16 9 views
1

I는 다음과 같습니다 ErrorHandler를 가지고 : 각도의 ErrorHandler는 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

구성 요소가 포함되어있는 의미있는 스택 트레이스와

그러나 때 생산의 각 CLI 사용 : ng build --prod --aot

출력은 동일한 오류입니다입니다

property 'toString' of undefined TypeError: Cannot read property 'toString' of undefined at e._next (http://xxx.azurewebsites.net/main.b21b245638698421733f.bundle.js:1:5701) at e.__tryOrSetError (http://xxx.azurewebsites.net/vendor.1cd9b81fc017fd7eac16.bundle.js:835:16880) at e.next

그래서이 나에게 의미있는 스택 추적이 아니다. 만약 내가 왜 내 개발 환경에서 같은 문제를 일으키는 구성 요소를 얻을 수 ??

프로덕션 사이트의 오류를 어떻게 처리합니까? 만약 내가 내 코드에있는 모든 장소에서 특정 형식의 엉 오류를 던질 수 있지만 catch 블록을 시도 잡으려고 잡으려고했을까요 ??

Stacktrace는 번들에 정의되지 않은 tostring을 표시하지 않고 오류를 담당하는 구성 요소를 항상 표시해야합니다!

답변

0

당신이 얻는 이유는 ng build --prod --aot 명령을 실행할 때입니다.

빌드는 번들링과 제한된 트리 - 떨림을 사용하는 반면 --prod 빌드는 UglifyJS를 통해 제한된 데드 코드 제거를 실행합니다.

단점 - 모든 오류 로그가 축소되어 번들 크기가 줄어 듭니다. i : 생산 빌드에서 uglified 오류 메시지가 나타나는 이유 중 하나가 e입니다. 이 위해서는

는하지만,이 명령을 사용할 수있다 일어날뿐만 아니라 테스트 ng serve --aot 또는 ng serve --prod에서 확인

The AOT compiler detects and reports template binding errors during the build step before users can see them.

+0

으로 오류를 확인하는 동안. 내 프로덕션 빌드에서 잘못되어 가고있는 부분에 대한 더 나은 정보를 얻으려는 나의 접근 방식은 내 자신의 오류 처리기를 각도로 작성한 다음 중요한 구성 요소가있는 구성 요소에 넣는 것이 었습니다. { something ... } catch (예) { setError (예, PersonDecideComponent.name, 'selectionChange'); } 내 오류 처리기에서 구성 요소 이름을 로그 아웃했습니다. och 어떤 메소드에서 예외가 발생했는지 로그 아웃했습니다. 그 해결책에 대해 어떻게 생각해야합니까? – NetProvoke

+0

당신은 aot를 할 때 정확한 오류를 얻을 수 없으며 최선의 방법을 구축하는 것은 catch를 사용하여 서버에 대한 참조를 위해 오류 또는 메서드를 보내어 파일에 로그인하는 것입니다. 그런 다음 해당 참조를 사용하여 디버깅 할 수 있습니다. –