Obsługa błędów w JavaScript
Ten artykuł wyjaśnia obsługę błędów w JavaScript.
YouTube Video
Obsługa błędów w JavaScript
Obsługa błędów w JavaScript to ważna funkcja służąca do przechwytywania i odpowiedniego obsługiwania błędów, gdy program napotyka nieoczekiwane problemy. Głównie używa się składni try...catch
do przechwytywania i obsługi błędów. Dodatkowo, podczas pracy z obiektami Promise lub operacjami asynchronicznymi, obsługa błędów może być również realizowana za pomocą async/await
lub Promise.prototype.catch
.
Składnia try...catch
try...catch
służy do przechwytywania i obsługi błędów, gdy występują w bloku kodu.
1try {
2 // Code that may throw an error
3 let result = riskyFunction();
4 console.log(result);
5} catch (error) {
6 // Catch and handle the error
7 console.error("An error occurred:", error.message);
8} finally {
9 // Code that will always execute
10 console.log("Error handling has completed.");
11}
- Jeśli błąd wystąpi wewnątrz bloku
try
, wykonanie programu zostaje przerwane, a blokcatch
zostaje wykonany. - Blok
finally
jest zawsze wykonywany, niezależnie od tego, czy wystąpi błąd, czy nie. Przydaje się do zwalniania zasobów i końcowego przetwarzania, między innymi.
Rzucanie błędów (throw
)
W JavaScript można jawnie wywołać błąd za pomocą słowa kluczowego throw
. Służy do rzucania niestandardowych komunikatów błędów lub niestandardowych błędów.
1function checkAge(age) {
2 if (age < 18) {
3 throw new Error("You are under 18 years old.");
4 }
5 return "Age verification completed.";
6}
7
8try {
9 let result = checkAge(15);
10 console.log(result);
11} catch (error) {
12 console.error(error.message); // Displays "You are under 18 years old."
13}
Obsługa błędów w operacjach asynchronicznych (Promise
i async/await
)
Podczas wykonywania operacji asynchronicznych obsługa błędów wygląda nieco inaczej. Podczas korzystania z obiektów Promise błędy są przechwytywane za pomocą metody catch
.
1let promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 setTimeout(() => reject(new Error("An issue has occurred!")), 1000);
4});
5
6promise
7 .then(result => console.log(result))
8 .catch(error => console.error(error.message)); // Displays "An issue has occurred!"
Podczas wykonywania operacji asynchronicznych za pomocą async/await
, błędy można obsługiwać za pomocą try...catch
.
1async function fetchData() {
2 try {
3 let response = await fetch('https://api.example.com/data');
4 let data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("An error occurred while fetching data:", error.message);
8 }
9}
10
11fetchData();
Podsumowanie
- Możesz przechwytywać błędy synchroniczne za pomocą składni
try...catch
. - Możesz rzucać własne błędy za pomocą
throw
. - Błędy w operacjach asynchronicznych mogą być obsługiwane za pomocą metody
catch
obiektuPromise
, lub przy użyciuasync/await
itry...catch
.
Korzystając z tych metod, możesz zapewnić poprawne działanie programu, nawet gdy występują błędy.
Error
Klasa Error
jest używana do obsługi błędów. Umożliwia tworzenie błędów oraz dostarczanie komunikatów błędów i stosów wywołań.
1try {
2 throw new Error("Something went wrong");
3} catch (e) {
4 console.log(e.message); // Something went wrong
5}
Podstawowe użycie
Obiekt Error
można jawnie utworzyć, gdy wystąpi błąd. Tworzysz instancję za pomocą new Error()
i przekazujesz komunikat błędu.
1const error = new Error("Something went wrong");
2console.log(error.message); // "Something went wrong"
3console.log(error.name); // "Error"
4console.log(error.stack); // Stack trace (information about where the error occurred)
Rzucanie błędów za pomocą throw
W JavaScript można rzucić błąd za pomocą słowa kluczowego throw
. Służy to przerwaniu przetwarzania w określonych sytuacjach i przekazaniu kontroli obsłudze błędów.
1function doSomething() {
2 throw new Error("This function is not yet implemented");
3}
4
5try {
6 doSomething();
7} catch (e) {
8 console.error(e.message); // "This function is not yet implemented"
9}
Błędy wyrzucone za pomocą throw
można przechwycić za pomocą składni try...catch
.
Tworzenie niestandardowych błędów
W JavaScript możesz tworzyć własne niestandardowe błędy poprzez rozszerzenie klasy Error
. Pozwala to na tworzenie błędów dostosowanych do konkretnych sytuacji.
1class CustomError extends Error {
2 constructor(message) {
3 super(message); // Call the parent class constructor
4 this.name = "CustomError"; // Set the error name
5 }
6}
7
8try {
9 throw new CustomError("A custom error has occurred");
10} catch (e) {
11 console.error(e.name); // "CustomError"
12 console.error(e.message); // "A custom error has occurred"
13}
Wbudowane klasy błędów
JavaScript posiada kilka wbudowanych klas błędów, które rozszerzają klasę Error
. Służą one do reprezentowania określonych błędów.
ReferenceError
: Występuje, gdy odwołujesz się do zmiennej, która nie istnieje.TypeError
: Występuje, gdy typ wartości różni się od oczekiwanego typu.RangeError
: Występuje, gdy liczba znajduje się poza dozwolonym zakresem.SyntaxError
: Występuje, gdy zostanie wykonany kod, który nie jest poprawny składniowo.EvalError
: Błędy związane z użyciem funkcjieval()
. Obecnie jest rzadko używany.URIError
: Występuje, gdy zostanie użyty nieprawidłowy URI (błędy kodowania lub dekodowania).
Przykład: ReferenceError
Oto przykład ReferenceError
.
1try {
2 console.log(undefinedVariable); // Undefined variable
3} catch (e) {
4 console.error(e.name); // "ReferenceError"
5 console.error(e.message); // "undefinedVariable is not defined"
6}
Przykład: TypeError
Oto przykład TypeError
.
1try {
2 null.f(); // Attempting to call a function on null
3} catch (e) {
4 console.error(e.name); // "TypeError"
5 console.error(e.message); // "Cannot read properties of null (reading 'f')"
6}
Blok finally
W składni try...catch
użyj bloku finally
dla operacji, które mają zostać wykonane niezależnie od tego, czy wystąpi błąd.
1try {
2 throw new Error("An issue has occurred");
3} catch (e) {
4 console.error(e.message); // "An issue has occurred"
5} finally {
6 console.log("Performing cleanup");
7}
W tym przykładzie operacje w bloku finally
są wykonywane nawet, jeśli zostanie zgłoszony błąd.
Właściwości obiektu Error
Obiekt Error
posiada następujące właściwości.
message
: To jest komunikat o błędzie.name
: Nazwa błędu, która domyślnie wynosi"Error"
.stack
: Ślad stosu zawierający informacje o miejscu wystąpienia błędu, przydatny przy debugowaniu.
Korzyści z obsługi wyjątków
Poprawna implementacja obsługi błędów pozwala zapobiec awarii aplikacji w przypadku nieoczekiwanego zachowania. Odpowiednie wykorzystanie składni try...catch
oraz obiektów błędów pozwala pisać bardziej niezawodny kod.
1function divide(a, b) {
2 if (b === 0) {
3 throw new Error("Cannot divide by zero");
4 }
5 return a / b;
6}
7
8try {
9 console.log(divide(4, 0)); // An error will occur
10} catch (e) {
11 console.error(e.message); // "Cannot divide by zero"
12}
Podsumowanie
- Klasa
Error
służy do reprezentowania przyczyny błędu oraz do obsługi błędów. - Używaj składni
try...catch...finally
, aby obsługiwać błędy i zapobiegać nieoczekiwanemu zakończeniu działania aplikacji. - Można również rozszerzyć klasę
Error
, aby tworzyć własne niestandardowe błędy. - Możesz obsługiwać różne typy błędów, korzystając z wbudowanych klas błędów, takich jak
TypeError
iReferenceError
.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.