Mam wiele funkcji, które albo zwracają coś, albo generują błąd. W funkcji głównej wywołuję każdą z nich i chciałbym zwrócić wartość zwracaną przez każdą funkcję lub przejść do drugiej funkcji, jeśli pierwsza funkcja generuje błąd.
Więc w zasadzie to, co obecnie mam, to:
function testAll() {
try { return func1(); } catch(e) {}
try { return func2(); } catch(e) {} // If func1 throws error, try func2
try { return func3(); } catch(e) {} // If func2 throws error, try func3
}
Ale tak naprawdę chciałbym tylko try
go zwrócić (tj. Jeśli nie zgłasza błędu). Nie potrzebuję catch
bloku. Jednak kod taki jak try {}
nie działa, ponieważ brakuje (nieużywanego) catch {}
bloku.
Umieściłem przykład na jsFiddle .
Czy jest więc jakiś sposób, aby catch
usunąć te bloki, osiągając ten sam efekt?
javascript
function
try-catch
return
pimvdb
źródło
źródło
null
i zrobić coś takiegoreturn func1() || func2() || func3();
try {}; finally {}
jak pokazano na stackoverflow.com/a/5764505/68210catch (e) {}
wyjątku zgłoszonego przezfunc1()
uniemożliwiłobyfunc2()
próbę.async
funkcji. Zmuszanie języka javascript do tworzenia pustychcatch
bloków jest oczywiście bezcelowe.Try bez catch klauzuli wysyła swój błąd do kolejnego wyższego połowu , lub w oknie, jeśli nie jest zdefiniowany w tym try catch.
Jeśli nie ma haczyk , wyrażenie try wymaga wreszcie klauzuli.
źródło
try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { try { // whatever; } finally { //always run}}}
?Możliwe jest posiadanie pustego bloku catch, bez zmiennej błędu, zaczynając od ES2019 . Nazywa się to opcjonalnym chwytaniem i zostało zaimplementowane w V8 v6.6, wydanej w czerwcu 2018 r . Ta funkcja jest dostępna od Node 10 , Chrome 66 , Firefox 58 , Opera 53 i Safari 11.1 .
Składnia jest pokazana poniżej:
Nadal potrzebujesz
catch
bloku, ale może on być pusty i nie musisz przekazywać żadnej zmiennej. Jeśli w ogóle nie chcesz bloku catch, możesz użyćtry
/finally
, ale pamiętaj, że nie połknie on błędów, tak jak robi to pusty catch.źródło
try
blokady. 2. Wyłapuje błąd. 3. Wykonujefinally
blok. 4. Zgłasza błąd. Czy to jest poprawne?catch
). Otocz cały kod innym znakiemtry
/,catch
a będziesz w stanie wyłapaćThis WILL get logged
błąd.Nie,
catch
(lubfinally
) jesttry
przyjacielem i zawsze tam jest w ramach próby / złapania .Jednak jest całkowicie poprawne, aby były puste, jak w twoim przykładzie.
W komentarzach w twoim przykładowym kodzie ( jeśli func1 zgłasza błąd, spróbuj func2 ), wydawałoby się, że to, co naprawdę chcesz zrobić, to wywołać następną funkcję wewnątrz
catch
bloku poprzedniego.źródło
try {...}; try {...}
byłby możliwy, znaczenie kodu może być jaśniejsze (spróbuj pierwszego, w przeciwnym razie spróbuj drugiego).return
stwierdzenie powstrzymuje cokolwiek po nim.return
spowoduje przedwczesny powrót funkcji. Zaktualizuję swoją odpowiedź.try {}; finally {}
jak pokazano na stackoverflow.com/a/5764505/68210finally{}
zasadniczo jest w tym samym duchu, cocatch{}
. Zaktualizuję odpowiedź.Nie polecałbym try-last bez catch, ponieważ jeśli zarówno try block, jak i final block throw błędy, w moim własnym teście pojawia się błąd wyrzucony w klauzuli final, a błąd bloku try jest ignorowany:
Wynik:
źródło
Pasują do wszystkich języków, które znam (JavaScript, Java, C #, C ++). Nie rób tego.
źródło
catch {my code}
Postanowiłem spojrzeć na przedstawiony problem z innej perspektywy.
Udało mi się znaleźć sposób, aby dokładnie uwzględnić żądany wzorzec kodu, częściowo odnosząc się do nieobsługiwanego obiektu błędu wymienionego przez innego komentatora.
kod można zobaczyć @ http://jsfiddle.net/Abyssoft/RC7Nw/4/
try: catch jest umieszczony w pętli for umożliwiającej wdzięczne opadanie. będąc w stanie iterować przez wszystkie potrzebne funkcje. gdy wymagana jest jawna obsługa błędów, używana jest dodatkowa tablica funkcji. nawet w przypadku tablicy błędów i funkcji z elementem obsługi błędów nie jest funkcją, błąd jest zrzucany do konsoli.
Zgodnie z wymaganiami stackoverflow tutaj kod jest wbudowany [edytowany tak, aby był zgodny z JSLint (usuń początkowe spacje w celu potwierdzenia), popraw czytelność]
Wcześniejsze
źródło
Jeśli chcesz, aby funkcje 2 i 3 były uruchamiane w przypadku wystąpienia błędu, dlaczego nie umieszczasz ich w bloku catch?
źródło
Uważam, że musisz użyć funkcji pomocniczej, takiej jak:
i używaj go jak:
źródło
try & catch są jak dwie strony jednej monety. więc nie jest możliwe bez próby.
źródło
try {}; finally {}
jak pokazano na stackoverflow.com/a/5764505/68210Od ES2019 możesz z łatwością używać
try {}
bezcatch {}
:Więcej informacji można znaleźć w propozycji Michaela Ficcary
źródło
catch
nadal jest wymagane, to tylko wiązanie, które nie jest wymagane ...