Napiszmy krótki przykład na którym będziemy dzisiaj pracować:
function DisplayTrimedWord(word) {
console.log(`Słowo: ${word} z usuniętymi białymi znakami: ${word.trim()}.`);
}
DisplayTrimedWord(' JavaScript '); //Słowo: JavaScript z usuniętymi białymi znakami: JavaScript.
Mamy prostą funkcję, która na podstawie przekazanego do funkcji argumentu wyświetla informację o przekazanym argumencie wraz z wartością tego argumentu i usuniętymi białymi znakami z początku i końca wartości zmiennej. Niby nic skomplikowanego, ale ta funkcja ma 1 dużą wadę, działa tylko dla parametrów typu string. Co by się stało gdyby ktoś do tej funkcji przekazał zamiast string'a np. zmienną typu boolean lub number? Zobaczmy:DisplayTrimedWord(24); //TypeError: word.trim is not a function
DisplayTrimedWord(true); //TypeError: word.trim is not a function
Dla obu tych przypadków dostajemy taką samą informację, a właściwie błąd: word.trim nie jest funkcją. Dzieje się tak ponieważ tak jak pisałem powyżej tylko obiekt string zawiera metodę trim(). Dodatkowo, co się wydarzy gdy przekażemy wartość np. null:DisplayTrimedWord(null); //TypeError: word is null
Znowu to samo czyli kolejny błąd, taka sytuacja jest na pewno nie pożądana. Jak to można zmienić? Są przynajmniej 2 metody, w jaki sposób można zmienić tą funkcję. Pierwsza z nich:function DisplayTrimedWord(word) {
if(typeof word !== 'string') {
return;
}
console.log(`Słowo: ${word} z usuniętymi białymi znakami: ${word.trim()}.`);
}
DisplayTrimedWord(' JavaScript ');
DisplayTrimedWord(24);
DisplayTrimedWord(true);
DisplayTrimedWord(null);
// Słowo: JavaScript z usuniętymi białymi znakami: JavaScript.
W powyższym przypadku, jeżeli argument nie jest typu string następuje za pomocą słowa return wyjście z funkcji. Jak widzisz został wyświetlony tylko 1 komunikat, czyli tylko 1 raz wykonała się cała funkcja, a w pozostałych przypadkach została zakończona na słowie return. Takie podejście nie jest najlepszym rozwiązaniem, ponieważ nie dostajemy żadnej informacji że coś poszło nie tak. Lepszym podejściem jest 2 sposób:function DisplayTrimedWord(word) {
if(typeof word !== 'string') {
throw new Error(`Zmienna ${word} nie jest typem string!`)
}
console.log(`Słowo: ${word} z usuniętymi białymi znakami: ${word.trim()}.`);
}
DisplayTrimedWord(' JavaScript '); // Słowo: JavaScript z usuniętymi białymi znakami: JavaScript.
DisplayTrimedWord(24); //Error: Zmienna 24 nie jest typem string!
DisplayTrimedWord(true); ////Error: Zmienna true nie jest typem string!
DisplayTrimedWord(null); ////Error: Zmienna null nie jest typem string!
Dodaliśmy na początku funkcji sprawdzanie czy faktycznie argument przekazany do funkcji jest typem takim jakiego oczekujemy, w tym wypadku string'iem. Jeżeli argument nie jest typu string zostaje rzucony wyjątek. Zaraz, jak to rzucony wyjątek? Przecież mieliśmy uniknąć takiej sytuacji! Zgadza się, ale dzięki takiej technice możemy rzucić swój własny wyjątek odpowiednio opisany, tak aby programista wiedział dokładnie co się stało, dlaczego program nie działa.Ok, krótki wstęp za nami :) Teraz przechodzimy do meritum, czyli tytułowego obsługiwania wyjątków. Funkcję powyższą możemy wywołać w taki sposób:
try {
DisplayTrimedWord(24);
}
catch (e) {
console.log(e);
}
lub:try {
DisplayTrimedWord(null);
}
catch (e) {
console.log(e);
}
Dzięki takiemu zapisowi nie otrzymamy żadnego wyjątku w programie, natomiast w konsoli wyświetli się odpowiedni komunikat, program będzie działał dalej w prawidłowy sposób. Działa to na takiej zasadzie, że jeżeli w bloku try wystąpi jakiś nieoczekiwany wyjątek to wtedy program przeskakuje do bloku catch i tam wykonują się odpowiednie instrukcji w razie wystąpienia tego wyjątku. Oczywiście blok catch można poprawić, w bloku catch można np. zapisać ten wyjątek do jakiegoś pliku czy bazy danych, ale o tym nie dzisiaj.To wszystko co chciałem Ci przekazać w tym artykule. Zapraszam Cię do kolejnych artykułów z serii podstaw programowania w języku JavaScript.
Poprzedni artykuł - Let vs var w JavaScript.
Następny artykuł - This w JavaScript.