Wykrywanie błędów przejściowych w kodzie

Ukończone

Po zapoznaniu się z możliwymi błędami przejściowymi, które mogą wystąpić w aplikacjach firmy, warto dodać kod pozwalający na ich wykrywanie. Każdą aplikację korzystającą z usług zewnętrznych należy tworzyć tak, aby wykrywała problemy w momencie ich wystąpienia. Jeśli usługa oparta na chmurze jest dobrze napisana i zaprojektowana, może zawierać dobrze udokumentowany kontrakt błędów przejściowych. Ten kontrakt może dać aplikacji kilka kroków, które może wykonać w celu obsługi i odzyskania sprawności po błędzie.

Representational State Transfer (REST) to podejście do pisania aplikacji klienckich i serwerowych. Usługi RESTful są bezstanowe, klient i serwer nie śledzą nawzajem swoich stanów. Żądanie REST jest wysyłane przez klienta i zwracana jest odpowiedź. Żądania REST są zwykle wysyłane za pośrednictwem żądań protokołu HTTP (na przykład GET i POST), więc zwrócona odpowiedź może zawierać standardowe błędy HTTP, na przykład:

  • 404: Identyfikator URI jest niedostępny, serwer nie może odnaleźć żądanego zasobu na serwerze.
  • 408: Limit czasu żądania, klient nie wysłał żądania w czasie dla serwera.
  • 449: kod zwrotny specyficzny dla firmy Microsoft, który udostępnia informacje o kliencie, których można użyć do ponawiania próby wykonania operacji.
  • 503: Usługa tymczasowo nie może obsłużyć odebranych żądań.
  • 504: Przekroczenie limitu czasu bramy, usługi nadrzędne nie mogły odpowiedzieć wystarczająco szybko.

Aplikacje firmowe, które korzystają z usług REST, powinny mieć możliwość obsługiwania tych błędów przejściowych. Twoja firma podjęła decyzję o użyciu platformy Azure. W zależności od używanych funkcji platforma Azure ma pewne dobrze zdefiniowane błędy, które należy obsłużyć.

Połączenia platformy Azure w ASP.NET mogą odbierać WebExceptionStatus.ConnectionClosedodpowiedzi , WebExceptionStatus.Timeoutlub WebExceptionStatus.RequestCanceled .

Bazy danych usługi Azure Cosmos DB to usługi RESTful, dzięki czemu mogą zwracać wszystkie standardowe błędy HTTP oraz określony kod błędu 429 , który powiadamia klienta, że szybkość żądań jest zbyt wysoka. Ten błąd może zostać zwrócony, jest przepływność jest zbyt mała albo liczba i rozmiar żądań są zbyt duże.

Usługa Azure SQL Database zawiera również dobrze zdefiniowane kody błędów, na przykład 40501: usługa jest obecnie zajęta. Ponów żądanie po X sekundach.

Aplikacja zespołu do czatów implementuje tablicę wirtualną. Użytkownicy mogą zostawiać komunikaty do odczytania dla całego zespołu. Używa ona bazy danych Azure Cosmos DB do przechowywania komunikatów utworzonych za pomocą interfejsu API bazy danych MongoDB. Zespół może szybko tworzyć klientów dla aplikacji do czatów na platformie .NET Core w języku C#, Java i środowisku Node, korzystając z posiadanej już wiedzy na temat bazy danych MongoDB.

Aplikacja do czatów powinna wykrywać następujące typy błędów:

  • Utracone połączenia z usługą Azure Cosmos DB.
  • Brak dostępności usługi.
  • Obsługa wyjątków zgłaszanych przez inne części aplikacji.

Niezależnie od błędu zwróconego przez usługę, aplikacje muszą przechwycić zwrócony błąd, sprawdzić go, a następnie podjąć odpowiednie kroki, aby go obsłużyć. Wszystkie języki programowania mają funkcje dostępne dla deweloperów w celu obsługi błędów w kodzie.

Wykrywanie błędów w kodzie

W języku C# mechanizm wykrywania i obsługi błędów to blok try catch. Można zdefiniować różne sposoby obsługi różnych błędów, określając wyjątek, który chcesz obsługiwać.

    try {

        // Some C# code

    }
    catch (an error) {

        // Some C# code to handle the specific error

    }
    catch (a different error) {

        // Some C# code to handle the specific error

    }

Wszystkie błędy dziedziczą po klasie wyjątku. catch bloki powinny być zdefiniowane w kolejności najbardziej specyficznej dla większości ogólnych. Ostatni blok catch powinien być podobny do następującego bloku:

    catch (Exception e) {

        // Will always match any exception that is raised

    }

Użycie tego catch bloku umożliwia programowi obsługę nieoczekiwanych błędów i w razie potrzeby wykonywać więcej operacji rejestrowania. W aplikacji czatu firmy występują błędy przejściowe, które mogą być zwracane z bazy danych MongoDB:

  • MongoDB.Driver.MongoConnectionException: wystąpił problem z hasłem, poświadczenie lub inną bazą danych Mongo DB.
  • System.TimeoutException: Wystąpił problem z połączeniem z bazą danych.

W języku Java mechanizm wykrywania i obsługi błędów to blok try catch. Można zdefiniować wiele połowów określających wyjątek, który chcesz obsłużyć.

    try {

        // Some JAVA code

    }
    catch (an error) {

        // Some JAVA code to handle the specific error

    }
    catch (a different error) {

        // Some JAVA code to handle the specific error

    }

Wszystkie błędy dziedziczą po klasie wyjątku. catch bloki powinny być zdefiniowane w kolejności najbardziej specyficznej dla większości ogólnych. Ostatni blok catch powinien być następujący:

    catch (Exception e) {

        // Will always match any exception that is raised

    }

Użycie tego catch bloku umożliwia programowi obsługę nieoczekiwanych błędów i w razie potrzeby wykonywać więcej operacji rejestrowania. W aplikacji czatu firmy występują błędy przejściowe, które mogą być zwracane z bazy danych MongoDB:

  • com.mongodb.MongoCommandException: Wystąpił problem z połączeniem z bazą danych, nie można wykonać polecenia.
  • com.mongodb.MongoSecurityException: wystąpił problem z hasłem lub poświadczenie albo baza danych jest niemożliwa do osiągnięcia.

W środowisku Node mechanizm wykrywania i obsługi błędów zależy od kontekstu. W przypadku kodu synchronicznego jest to blok try catch. Jeśli podczas działania kodu zostanie zgłoszony wyjątek, możesz zdefiniować przechwyt, które określają wyjątek, który chcesz obsłużyć.

    try {

        //Some javascript code

    }
    catch (error) {

        if (error.code === 'specific error') {

            //Some javascript code to handle the specific error

        } else {

            //Handle all other errors

        }
    }

Środowisko Node zostało jednak zbudowane jako asynchroniczne. Aby obsłużyć błędy występujące w kodzie asynchronicznym, język definiuje koncepcję obietnic. Jeśli wywołasz funkcję asynchroniową, możesz użyć catch() obietnicy, która zostanie wykonana, jeśli funkcja zwróci jakiekolwiek błędy.

    async-function-call()
        .then( () => {
            // handle response
            }
        )
        .catch( err => {
            // handle any raised exceptions
            }
        )

W aplikacji czatu firmy występują błędy przejściowe, które mogą być zwracane z bazy danych MongoDB:

  • MongoNetworkError: Wystąpił problem z połączeniem z bazą danych.
  • MongoError: wystąpił problem z hasłem, poświadczeniami lub inną bazą danych.

W przypadku wykrycia błędu i błędu jest klasyfikowany jako przejściowy. Aplikacja musi zdecydować, czy może ponowić próbę wykonania operacji w bezpieczny sposób dla aplikacji i usługi.