Czy mogę zdefiniować niestandardowe typy dla wyjątków zdefiniowanych przez użytkownika w JavaScript? Jeśli tak, jak mam to zrobić?
javascript
exception
Manki
źródło
źródło
Odpowiedzi:
Od WebReference :
źródło
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ lubcatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Należy utworzyć niestandardowy wyjątek, który prototypowo dziedziczy po błędzie. Na przykład:
Jest to w zasadzie uproszczona wersja tego, co zniechęcony opublikował powyżej, z ulepszeniem, które ślady stosu działają w przeglądarce Firefox i innych przeglądarkach. Spełnia te same testy, które opublikował:
Stosowanie:
I będzie się zachowywać, należy się spodziewać:
źródło
Możesz wdrożyć własne wyjątki i ich obsługę, na przykład jak tutaj:
Istnieje inna składnia do przechwytywania wpisanego wyjątku, chociaż nie działa to w każdej przeglądarce (na przykład nie w IE):
źródło
Tak. Możesz rzucać cokolwiek zechcesz: liczby całkowite, łańcuchy, obiekty, cokolwiek. Jeśli chcesz rzucić obiekt, po prostu stwórz nowy obiekt, tak jak zrobiłbyś go w innych okolicznościach, a następnie rzuć nim. Odwołanie do Mozilli w JavaScript zawiera kilka przykładów.
źródło
Pozwala to na użycie takie jak ..
źródło
e instanceof Error
byłoby fałszywe.e instanceof MyError
byłoby to prawdą,else if(e instanceof Error)
oświadczenie nigdy nie zostanie ocenione.else if(e instanceof Error)
byłby ostatni haczyk. Najprawdopodobniej następuje prostyelse
(którego nie uwzględniłem). Coś w rodzajudefault:
instrukcji switch, ale zawiera błędy.W skrócie:
Jeśli używasz ES6 bez transpilatorów :
Zobacz Rozszerzanie błędu w Javascript przy pomocy składni ES6, aby zapoznać się z aktualną najlepszą praktyką
Jeśli używasz transpilatora Babel :
Opcja 1: użyj rozszerzenia Babel-plugin-transform-builtin-extension
Opcja 2: zrób to sam (zainspirowany tą samą biblioteką)
Jeśli używasz czystego ES5 :
Alternatywnie: użyj szkieletu Classtrophobic
Wyjaśnienie:
Dlaczego rozszerzenie klasy Error za pomocą ES6 i Babel jest problemem?
Ponieważ wystąpienie CustomError nie jest już rozpoznawane jako takie.
W rzeczywistości, z oficjalnej dokumentacji Babel, to nie może przedłużyć jakikolwiek wbudowanych klas JavaScript , takich jak
Date
,Array
,DOM
lubError
.Problem opisano tutaj:
Co z innymi odpowiedziami SO?
Wszystkie podane odpowiedzi rozwiązują
instanceof
problem, ale tracisz regularny błądconsole.log
:Podczas korzystania z metody wspomnianej powyżej nie tylko naprawiasz
instanceof
problem, ale także utrzymujesz regularny błądconsole.log
:źródło
Oto, w jaki sposób można tworzyć niestandardowe błędy o całkowicie identycznym
Error
zachowaniu natywnym . Technika ta działa tylko w Chrome i node.js teraz. Nie polecałbym go również używać, jeśli nie rozumiesz, co on robi.Jako wynik otrzymujemy
Następnie możesz użyć tego w następujący sposób:
I używaj
NotImplementedError
tak, jakbyśError
:I będzie się zachowywać, należy się spodziewać:
Zauważ, że to
error.stack
działa absolutnie poprawnie i nie będzie zawieraćNotImplementedError
wywołania konstruktora (dzięki v8Error.captureStackTrace()
).Uwaga. Jest brzydka
eval()
. Jedynym powodem, dla którego jest używany, jest poprawnośćerr.constructor.name
. Jeśli go nie potrzebujesz, możesz nieco uprościć wszystko.źródło
Error.apply(self, arguments)
jest określony, aby nie działać . Zamiast tego sugeruję skopiowanie śladu stosu, który jest kompatybilny z różnymi przeglądarkami.Często używam podejścia z dziedziczeniem prototypowym. Przesłonięcie
toString()
daje tę przewagę, że narzędzia takie jak Firebug będą rejestrować rzeczywiste informacje zamiast[object Object]
w konsoli w celu przechwycenia wyjątków.Służy
instanceof
do określania rodzaju wyjątku.main.js
Exception.js
DuplicateIdException.js
źródło
ES6
Dzięki nowej klasie i rozszerzaniu słów kluczowych jest teraz o wiele łatwiej:
źródło
Użyj instrukcji throw .
JavaScript nie dba o typ wyjątku (tak jak Java). JavaScript tylko zauważa, istnieje wyjątek, a kiedy go złapiesz, możesz „spojrzeć” na to, co mówi wyjątek.
Jeśli masz różne typy wyjątków, które musisz zgłosić, sugeruję użycie zmiennych zawierających ciąg / obiekt wyjątku, tj. Komunikat. Tam, gdzie jest to potrzebne, użyj „wyrzuć mój wyjątek”, a następnie złap wychwycony wyjątek od mojego wyjątku.
źródło
Zobacz ten przykład w MDN.
Jeśli musisz zdefiniować wiele błędów (przetestuj kod tutaj !):
Kod jest w większości kopiowany z: Jaki jest dobry sposób na rozszerzenie Błąd w JavaScript?
źródło
Alternatywa dla odpowiedzi asselin do użytku z klasami ES2015
źródło
Teraz ustawiamy dodając przyczynę lub dowolne właściwości, które chcemy, do obiektu błędu i pobieramy go. Uczyniając błąd bardziej rozsądnym.
źródło