2015-03-08 12 views
5

Czytam się na JavaScript exceptions:JavaScript zagnieżdżone try wyjątek

You can nest one or more try...catch statements. If an inner try...catch statement does not have a catch block, the enclosing try...catch statement's catch block is checked for a match.

Chyba zrozumiałem prawidłowo i napisał ten kod testowy następująco:

try { 

    try { 
     throw "error"; 
    } 

} catch(e) { 

    console.log(e); 

} 

Ale mam ten błąd:

Uncaught SyntaxError: Missing catch or finally after try

Wiem, że wyraźnie mówi, że na brakuje mi haczyka lub wreszcie, ale dokumentacja JavaScript mówi, że mój kod powinien być poprawny, czy też nie rozumiem?

+0

Zdajesz sobie sprawę, że 'try { } 'block bez żadnego' catch' z 'finally' w rzeczywistości nie wykonałby niczego, nawet jeśli byłby dozwolony, ponieważ jedynym powodem umieszczenia czegoś w bloku' try' jest obsługa wyjątku. Ma sens, że to błąd. – jfriend00

+0

Tak, wiem. Właśnie testowałem to i myślałem, że nie rozumiem dokumentów, więc skonsultowałem się z SO, aby wyjaśnić, że link do tego pomógł bardziej niż przewodnik MDN: http://www.ecma-international.org/ecma-262/5.1 /#sec-12.14 –

Odpowiedz

9

Cytowany tekst jest dość mylący, ponieważ mówi "jeśli wewnętrzna próba ... nie ma bloku catch", co nie ma żadnego sensu. Powinno to być po prostu "jeśli wewnętrzna try nie ma ...".

W JavaScript, nie można po prostu samodzielnie mieć try; to ma, aby mieć catch, finally lub oba. Więc scenariusz, że zacytować odnosi się więc isa try/catch zawierająca try/finally (nie inny try/catch):

try { 
    try { 
     throw "error"; 
    } 
    finally { 
    } 
} catch(e) { 
    console.log(e); 
} 
+0

Specyfikacja mówi: "Instrukcja try ... catch składa się z bloku try, który zawiera jedną lub więcej instrukcji i zero lub więcej bloków catch", ale gdzie jest napisane cokolwiek o blokach catch catch = => wymagany jest blok 'finally'? – BaseZen

+0

@BaseZen: W [§12.14] (http://www.ecma-international.org/ecma-262/5.1/#sec-12.14), gdzie pokazuje prawidłową listę instrukcji "try', które są" ' try' * Block * * Catch * "," 'try' * Block * * Finally *" i "' try' * Block * * Catch * * Finally * "(zanotuj absense po prostu" 'try' * Block * "). –

+0

Myślę, że ktoś powinien naprawić wprowadzającą w błąd dokumentację/przewodnik. –

Powiązane problemy