Angular에서 오류를 처리하는 간단한 접근 방식
HTTP 오류는 외부 API 예제를 처리할 때마다 발생합니다. 끝점을 호출하고 네트워크가 다운되거나 호출 서버를 만드는 동안 요청을 제대로 처리할 수 없었고 그 대가로 오류 등을 보냅니다. 서버와 관련된 모든 시나리오 5xx 및 4xx 역할의 응답 상태가 이 범주에 속합니다. Angular에서는
HttpErrorResponse
로 식별됩니다.클라이언트(브라우저) 오류는 코드 작성 중 개발자의 실수로 인해 런타임에 주로 발생하는 오류입니다. 이러한 오류의 유형은 다음과 같습니다. 그러한 예:
(windows as any).abc.pqr = '';
// here property `abc` is not defined on global window object so
// `(windows as any).abc` will result into undefined and
// undefined.pqr will throw TypeError: stating that we are
// trying to set something on a property that does not exists
따라서 개발자가 유발하는 이러한 오류는 클라이언트(브라우저) 오류 범주에 포함됩니다.
두 상황 모두에서 가장 고통받는 것은 최종 사용자입니다. 이러한 오류가 발생할 때마다 JavaScript 실행이 중지되고 화면이 정지되어 최종 사용자에게 좋지 않은 경험을 제공합니다. 따라서 이러한 오류를 처리하고 사용자를 오류 페이지로 라우팅하고
EvalError
와 같은 일부 사용자 정의 메시지를 표시하는 것과 같은 관련 작업을 수행하는 것이 좋습니다.Angular는 이러한 오류를 포착하는 데 사용할 수 있는 기본 메서드
InternalError
를 제공하는 클래스RangeError
를 제공합니다.@Injectable()
class MyErrorHandler implements ErrorHandler {
handleError(error: Error) {
// do something with the exception like router.navigate(['/error-page']);
}
}
ReferenceError
를 사용하여 오류를 포착하고 사용자를 일반 SyntaxError
로 리디렉션할 수 있습니다. 여기서 한 가지 문제는 사용자 정의URIError
구현에서 도우미 서비스를 어떻게 주입할 것인가입니다.우리가 일반적으로하는 것처럼 서비스를 주입하면
constructor(private router: Router){}
오류가 발생합니다.
Error: NG0200: Circular Dependency in DI detected for ErrorHandler
Angular는 공급자보다 먼저 생성
TypeError
하지 않으면 적용 초기 단계에서 발생하는 오류를 포착할 수 없습니다. 따라서 공급자는 Something Went Wrong! Please try again later!
에서 사용할 수 없습니다. 따라서 인젝터를 사용하여 종속 서비스를 주입해야 합니다.@Injectable()
class MyErrorHandler implements ErrorHandler {
constructor(private injector: Injector){}
handleError(error: Error) {
const router = this.injector.get(Router);
router.navigate(['/error-page']);
}
}
이것은 한 문제를 해결하지만 다른 문제로 이어집니다.
Navigation triggered outside Angular zone, did you forget to call
ngZone.run()
여기서 문제는 도우미 서비스를 주입하는 동안 이전과 정확히 동일합니다. ErrorHandle은 일반 ngZone 외부에서 실행됩니다. 따라서 변경 감지의 규칙적인 흐름이 방해받지 않도록 영역 외부에서 탐색이 이루어져야 합니다.
@Injectable()
class MyErrorHandler implements ErrorHandler {
constructor(
private injector: Injector,
private zone: NgZone,
){}
handleError(error: Error) {
const router = this.injector.get(Router);
this.zone.run(() => router.navigate(['/error-page']));
console.error('Error Caught: ', error);
}
}
이를 달성했으면 루트 모듈(예: AppModule)에 이 서비스를 제공해야 합니다.
@NgModule({
providers: [{provide: ErrorHandler, useClass: MyErrorHandler}]
})
class MyModule {}
위의
ErrorHandler
메소드에 더 많은 사용자 정의를 추가할 수 있습니다.handleError(error: Error) {
if (error instanceof HttpErrorResponse) {
// HTTP related error
} else if (error instanceof TypeError || error instanceof ReferenceError) {
// Runtime exceptions mostly induced by Developer's code
} else {
// catch-all: catch rest of errors
}
}
Reference
이 문제에 관하여(Angular에서 오류를 처리하는 간단한 접근 방식), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aakashgoplani/a-simple-approach-towards-handling-errors-in-angular-2pd7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)