Обработка ошибок в угловом углу
Когда дерьмо произойдет, другие люди говорят вам «иметь надежду, есть свет в конце туннеля; даже если вы этого не видите». Сегодня вы ограблены на различных решениях при работе с самой важной частью дерьма обработки ошибок в угловом углу.
Хотя, когда это произойдет, вы можете выбирать его игнорировать и позволить ему принести стыд, это не мои молитвы для вас, я знаю, что это сложно, но лучший способ решать их, зависит от того, откуда они приходят из:
Внешние ошибки
Самые простые; Почему (в том) вы всегда можете обвинить кого-то другого, как бэкэнд, ребята или администратор, потому что это не напрямую ваша вина, но в этих случаях мы не можем сделать гораздо больше, чем обрабатывать их, уведомить пользователя и молиться администратору Это. Эти ошибки обычно происходят с сервера, и его свойства имеют код состояния, начиная с 5 (5xx …) и сообщение об объяснении, поэтому мы можем узнать, что вызвало его и реагировать правильно. Хотя они некоторые, которые мы не можем справиться, как браузер или авария ОС.
Внутренние ошибки
Это ваша вина, вам нужно принять, что вы не смогли исправить такие ошибки и изучать урок. Что сейчас проходит через ваш разум, так это то, как вы можете дифференцировать их правильно? Но хорошая новость в том, что они уведомит вас, когда они придут. Сервер: кажется, что свойства в ошибках сервера не фиксированы, по крайней мере, я не нашел никакого стандарта. Ошибка сервера может содержать:
- Статус (или код): Состояние кода, начиная с 4 (4xx …). Есть 28 статус.
- Имя: имя ошибки (т.е. httperrorresponse).
- Сообщение: Пояснение сообщения (т. Е. Ответ HTTP-отказа на …).
Клиент (браузер):
На основании универсального конструктора ошибок JavaScript выбрасывает ошибку каждый раз, когда что-то идет не так. Наиболее распространенные ошибки являются FASTERERROR (вызов несуществующей переменной) и в TypeError (т. Е. Попробуйте выполнить переменную, так как это была функция). Есть еще 5 типов. Ошибка клиента должна содержать:
- Имя (т. Е. Справочник).
- Сообщение (т.е. x не определено). И в большинстве современных браузеров: имя файла, бельнум и столбцом, где произошло ошибка, а стек (последние X функции вызывается до ошибки). Ошибки, исключения и каллубка Когда происходит ошибка, исключение брошено в текущей точке выполнения, которая удаляет каждую CallStack до тех пор, пока исключение не обрабатывается блоком TRY/CATH. Если исключения ошибок не обрабатываются, это приведет к разрыву стопки приложения, и вы будете смущать себя перед вашими пользователями. Чем дерьмо! Как бороться со всем этим дерьмом По умолчанию Angular поставляется с собственным ErrorHandler, который перехватывает все ошибки, но если мы используем, мы просто хотим, чтобы жизнь контролировала нас, давайте контролировать жизнь. Создайте новый класс в вашей жизни называется: ошибки;
// errors-handler.ts import { ErrorHandler, Injectable} from '@angular/core'; @Injectable() export class ErrorsHandler implements ErrorHandler { handleError(error: Error) { // Do whatever you like with the error (send it to the server?) // And log it to the console console.error('It happens: ', error); } }
Не будь слишком грубым угловым угловым углом, прежде чем он проклинает вас с ошибками, которые запутают вас, просто скажите угловой, у вас есть класс, который вы хотите использовать вместо его по умолчанию, доверяйте мне, угловой – это ваш бог здесь, это позволит вам. (Обеспечить это)
// errors.module.ts @NgModule({ imports: [ ... ], declarations: [ ... ], providers: [ { provide: ErrorHandler, useClass: ErrorsHandler, } ] }
Теперь каждый раз, когда происходит новое дерьмо (ошибка), угловой будет в системе «Это случается», а затем ошибка в консоли. Как узнать их внутри ErrorHandler, мы можем проверить, какая ошибка это:
// errors-handler.ts import { ErrorHandler, Injectable} from '@angular/core'; import { HttpErrorResponse } from '@angular/common/http'; @Injectable() export class ErrorsHandler implements ErrorHandler { handleError(error: Error | HttpErrorResponse) { if (error instanceof HttpErrorResponse) { // Server or connection error happened if (!navigator.onLine) { // Handle offline error } else { // Handle Http Error (error.status === 403, 404...) } } else { // Handle Client Error (Angular Error, ReferenceError...) } // Log the error anyway console.error('It happens: ', error); }
Как реагировать на каждый
Ошибки сервера и подключения
Ошибки сервера и подключения влияют на то, как приложение связывается с сервером. Если приложение не является онлайн, ресурс не существует (404), пользователю не допускается доступа к данным (403) … httpClient предоставит нам информативную ошибку, которую мы должны обрабатывать, но наше приложение не хватает И риск повреждения данных или потерян. Как правило, я думаю, что такие ошибки нуждаются в уведомлении; Четкое сообщение, объясняющее пользователя, что происходит и как продолжить. Для этого мы будем использовать службу уведомления.
// errors-handler.ts @Injectable() export class ErrorsHandler implements ErrorHandler { constructor( // Because the ErrorHandler is created before the providers, we'll have to use the Injector to get them. private injector: Injector, ) { } handleError(error: Error | HttpErrorResponse) { const notificationService = this.injector.get(NotificationService); if (error instanceof HttpErrorResponse) { // Server or connection error happened if (!navigator.onLine) { // Handle offline error return notificationService.notify('No Internet Connection'); } else { // Handle Http Error (error.status === 403, 404...) return notificationService.notify(`${error.status} - ${error.message}`); } } else { // Handle Client Error (Angular Error, ReferenceError...) } // Log the error anyway console.error('It happens: ', error); }
- Здесь мы могли справиться с конкретными ошибками. Например, если это ошибка 403, мы могли бы уведомить пользователя, а затем перенаправить на страницу входа. Поскольку лучшая ошибка – это тот, который никогда не случается, мы могли бы улучшить нашу обработку ошибок, используя HTTPINTERCECTOR, который перехватил бы все вызовы серверов и повторить их раза, прежде чем бросать ошибку:
// server-errors.interceptor.ts import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/retry'; @Injectable() export class ServerErrorsInterceptor implements HttpInterceptor { intercept(request: HttpRequest, next: HttpHandler): Observable > { // If the call fails, retry until 5 times before throwing an error return next.handle(request).retry(5); } }
Затем нам нужно сказать, что он должен использовать наш класс Server ServerorSterTore в каждом HTTP Call:
// errors.module.ts @NgModule({ imports: [ ... ], declarations: [ ... ], providers: [ { provide: HTTP_INTERCEPTORS, useClass: ServerErrorsInterceptor, multi: true, }, ] })
Ошибки клиента
Клиентские ошибки кажутся более опасными для меня. Они могут полностью аварийровать наше приложение, происходить коррумпированные данные, которые могут быть сохранены на сервере, сохраняйте пользователь, работающий над вещами, которые не будут сохранены … Я думаю, что эта ситуация претендует на более строгий ответ: если что-то сломано в нашем приложении , нам нужно остановить приложение, перенаправить пользователя на экран ошибки со всей информацией, исправить его как можно скорее и сообщить пользователю, что он был исправлен. Для этого мы могли бы использовать ErrorComponent, которая принимает данные об ошибках из параметров запроса маршрута:
// errors-handler.ts @Injectable() export class ErrorsHandler implements ErrorHandler { constructor( private injector: Injector ) { } handleError(error: Error | HttpErrorResponse) { const notificationService = this.injector.get(NotificationService); const router = this.injector.get(Router); if (error instanceof HttpErrorResponse) { // Server or connection error happened if (!navigator.onLine) { // Handle offline error return notificationService.notify('No Internet Connection'); } else { // Handle Http Error (error.status === 403, 404...) return notificationService.notify(`${error.status} - ${error.message}`); } } else { // Handle Client Error (Angular Error, ReferenceError...) router.navigate(['/error'], { queryParams: {error: error} }); } // Log the error anyway console.error('It happens: ', error); }
Как отслеживать ошибки
Это лучший способ остановить мусор в жизни, но африканские мужчины говорили: «Старейшины не спешите разговаривать», давайте сохраним эту дискуссию до следующей недели, оставайтесь на месте, находящиеся на месте для части 2.