Instrukcja try...catch
Instrukcja try...catch
śledzi blok instrukcji try, i określa jedną lub więcej odpowiedzi które powinny wyrzucić wyjątki. Jeśli wyjątek jest rzucony, instrukcja try...catch
go łapie.
Instrukcja try...catch
stanowi blok try
, który stanowi jedną lub więcej instrukcji, i zero lub więcęj bloków stanowiących catch
, instrukcję, który określa będzie wykonana jeśli wyjątek wystąpi w bloku try. To jest, to co nastąpi w bloku try
, i jeśli nie nastąpi, chcesz przejąć kontrolę bloku catch
. Jeśli jakakolwiek instrukcja bez bloku try
(lub w nazwie funkcji nie występuje blok try
) wyrzucany jest wyjątek, kontrola natychmiastowo wraca do bloku wyjątku, catch
. Jeśli nie jest wyrzucony wyjątek w następującym bloku try
, blok catch
zostanie opuszczony. Blok kończący (finall) wykonany jest po wykonanych blokach try
i catch
przed instrukcjami następująca instrukcja try...catch
.
Następujący przykład używa instrukcji try...catch
. Przykład nazywa się funkcją, która odzyskuje nazwę miesiąca z tablicy, która jest ulokowana w wartości przychodzącej do funkcji. Jeśli wartość nie jest przesyłana jako numer miesiąca (1-12), wyrzucony jest wyjątek wartości InvalidMonthNo
i instrukcje w bloku catch
ustawiają zmienną monthName
na unknown
.
function getMonthName (mo) { mo=mo-1; // Adjust month number for array index (1=Jan, 12=Dec) var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul", "Aug","Sep","Oct","Nov","Dec"); if (months[mo] != null) { return months[mo] } else { throw "InvalidMonthNo" } } try { // statements to try monthName=getMonthName(myMonth) // function could throw exception } catch (e) { monthName="unknown" logMyErrors(e) // pass exception object to error handler }
Blok catch
Użyj pojedyńczego bloku catch
do uchwytu wszystkich wyjątków, które mogą generować w bloku try
, lub Ty potrafisz użyć separatora bloków catch
, każdego, którego uchwyty są szczególnym typem wyjątku.
Pojedyńczy blok catch
Użyj pojedyńczej instrukcji try...catch
, bloku catch
(odzyskanie bloku) wykonane kodu błędu uchwytu dla kazdego wyjątku wyrzuconego w bloku try
.
Pojedyńczy blok catch
ma następującą składnie:
catch (catchID) { statements }
Blok catch
wyszczególnia identyfikatory (catchID
w poprzedzającej składni), którego wartość jest trzymana w bliżej określnonej instrukcji throw
; użyj tego identyfikatora do pobrania informacji o wyjątku, który był zrzucony. JavaScript tworzy ten identyfikator, kiedy catch
jest wstępem; ostatni identyfikator tylko dla czasu działanaia bloku catch
; po bloku catch
kończy wykonywanie identyfikatora, który jest nie długo dostępny.
Na przykład, następujący kod wyrzuca wyjątek. Kiedy wyjątek ma miejsce kontrolne cesje są w bloku catch
.
try { throw "myException" // generuje wyjątek } catch (e) { // instrukcja trzymająca jakikolwiek wyjątek logMyErrors(e) // przechodzi z obiektu wyjątku exception object to error handler }
Wielokrotne bloki catch
Pojedyńcza instrukcja try
stanowi wielokrotny warunkowe bloki catch
, każdy który trzyma określony typ wyjątku. W tym przypadku przywłaszcza odpowiedni warunek blok catch
jest możliwy wstęp tylko kiedy wyjątek określa, który blok jest wyrzucony. Mozesz także opcjonalnie dla wszystkich bliżej nieokreślonych bloku wyjątków catch-all catch
jako finalnego bloku w instrukcji bloku catch.
Na przykład, nstępująca instrukcja powołuje się na trzy inne funkcje (deklarując je gdziekolwiek) który waliduje jego argumenty. Jeśli funkcja walidacji decyduje który komponent jest sprawdzany to wskazuje który nie przechodzi walidacji, to zwraca 0, wywołując odpowiednia wyskok szczególnego wątku.
function getCustInfo(name, id, email) { var n, i, e; if (!validate_name(name)) throw "InvalidNameException" else n = name; if (!validate_id(id)) throw "InvalidIdException" else i = id; if (!validate_email(email)) throw "InvalidEmailException" else e = email; cust = (n + " " + i + " " + e); return (cust); }
Blok warunkowy catch
kontroluje drogę dobierając odpowiedni uchwyt wyjątku.
try { // funkcja wyrzucająca trzy wyjątki getCustInfo("Lee", 1234, "lee@netscape.com") } catch (e if e == "InvalidNameException") { // nazwa uchwytu dla niepoprawnej nazwy bad_name_handler(e) } catch (e if e == "InvalidIdException") { // nazwa uchwytu dla błędnych id bad_id_handler(e) } catch (e if e == "InvalidEmailException") { // nazwa uchwytu dla błednego adresu email bad_email_handler(e) } catch (e){ // nie wiadomo co robi, ale się loguje logError(e) }
Blok finally
Blok finally
stanowi instrukcja wykonywana po sprawdzeniu i wykonaniu bloku catch
, ale przed następującą instrukcją try...catch
. Blok finally
wykonany gdziekolwiek lub nie jest wyjątkiem thrown
. Jeśli wyjątek jest thrown
, instrukcje w bloku finally
wykonane równo, jeśli blok catch
trzyma wyjątek.
Możesz używać bloku finally
do zrobienia Twojego błędnego skryptu, kiedy ma miejsce wyjątku; na przykład, możesz potrzebować zwolnić źródło, którego Twój skrypt ma powiązanego. Następujący przykład otwiera plik i następnie wykonuje instrukcję, która użyje pliku (server-side pozwoli Ci w JavaScript uzyskać dostęp do pliku). Jeśli wyjątek jest rzucony, gdy plik jest otwarty, a blok finally
zamyka pliki przed danymi skryptami.
openMyFile(); try { writeMyFile(theData) } finally { closeMyFile() // zawsze zamykaj źródło }
Zagnieżdżanie instrukcji try...catch
Żądaj jeden lub więcej instrukcji try...catch
. Jeśli wewnętrzna instrukcja try...catch
nie ma bloku catch, otoczamy blok catch i instrukcja try...catch
jest zaznaczona dla danej wartości.