Angular · BoardGamesNook · C# · Daj Się Poznać 2017 · Programowanie · TypeScript

Obsługa błędów

Zabrałam się do pracy nad aplikacją i nagle zobaczyłam, że dodawanie nowej gry nie działa poprawnie – a raczej nie działa w ogóle. Wszystko pięknie, naprawi się w przyszłości, ale czemu nie mam żadnej informacji po stronie klienta, że coś poszło nie tak? Musiałam zabrać się więc za obsługę błędów.

Załóżmy kilka przypadków błędów po stronie serwera:

1 niezidentyfikowany błąd (np. brak połączenia z bazą danych),

2 zidentyfikowany błąd (np. brak obiektu o danym id).

W każdym z tych przypadków chciałabym, żeby użytkownik dostał informację zwrotną o tym, co poszło nie tak.

Po stronie serwera metoda obsługująca dodanie nowej gry wygląda następująco:

[HttpPost]
public JsonResult Add(string name)
{
    int boardGameId = BoardGameGeekIntegration.BGGBoardGame.GetBoardGameId(name);
    if (boardGameId != 0)
    {
       BoardGame boardGame = BoardGameGeekIntegration.BGGBoardGame.GetBoardGameById(boardGameId);
       boardGame.Id = boardGameService.GetAll().Select(x => x.Id).LastOrDefault() + 1;
       boardGameService.Add(boardGame);
       return Json(null, JsonRequestBehavior.AllowGet);
    }
    return Json("Nie znaleziono gry o nazwie " + name, JsonRequestBehavior.AllowGet);
}

Widać, że w przypadku nieznalezienia Id dla danej gry (boardGameId) w serwisie BoardGameGeek (z którego pobieramy informacje), logika pobierająca szczegóły tej gry nie zostanie wywołana i zostanie zwrócony Json z informacją o nie odnalezieniu gry o danej nazwie.

Sprawdźmy jak to może wyglądać po stronie użytkownika. Podajemy nazwę gry:

addTest.PNG

I klikamy przycisk Dodaj. Otrzymujemy komunikat:

errorMsg.PNG

Wiadomo więc, co się stało i dlaczego gra nie została dodana.

A co w przypadku jakiegoś niezidetyfikowanego błędu po stronie serwera?

errorServer.PNG

Dla moich aktualnych potrzeb takie informacje wystarczają. Oczywiście obsługa błędów dla rzeczywistych użytkowników będzie musiała być bardziej dopracowana, ale na początek zaczynamy od tego.

Zobaczmy, jak to wygląda po stronie frontendu. Utworzyłam plik common.ts, w którym zawarłam metody dostępne dla wszystkich komponentów:

import { Location } from '@angular/common';

export class Common {
   constructor(
      private location?: Location
   ) { }

   goBack(): void {
      this.location.back();
   }

   showErrorOrGoBack(errorMessage): void {
      if (errorMessage !== "") {
         alert(errorMessage);
         return;
      }
      else {
         return this.goBack();
      }
   }

   handleError(error: any, message?: any): Promise<string> {
      let errorDetails: string = error.message !== "" ? error.message : "";
      if (error !== "Error") {
message += error;
}
      else if (typeof error.message != "undefined" && error.message !== "") {
message += errorDetails;
}
      else {
         message = "Wystąpił nieznany błąd";
      }
      return message;
   }
}

Jest więc tu metoda goBack() powrotu do poprzedniej strony, metoda showErrorOrGoBack() obsługująca błąd lub wracająca do poprzedniej lokalizacji, oraz metoda handleError() definiująca wyświetlany komunikat o błędzie.

Obsługa błędów dla przykładowej akcji dodawania nowej gry wygląda następująco:

  • po stronie serwisu:
create(name: string): Promise<string> {
   return this.http
   .post(`${this._addBoardGameUrl}`, JSON.stringify(name), { headers: this.headers })
   .toPromise()
   .then(response => { return response.text(); })
   .catch(ex => { return new Common().handleError(ex) });
}
  • po stronie komponentu:
add(name: string): void {
   var loc = this.location;
   this.boardGameService.create(name)
   .then(errorMessage => {
      new Common(loc).showErrorOrGoBack(errorMessage);
   });
}

Moje rozwiązanie na pewno wymaga dopracowania, ale na początek może być. Jeśli wiecie o czymś, o czym ja nie wiem (w zakresie obsługi błędów w Angularze) to zachęcam do komentowania.

Tyle na dzisiaj, bo nowa planszówka czeka, żeby w nią zagrać 😉

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s