Chcę napisać typową procedurę obsługi błędów, która będzie łapać niestandardowe błędy zgłaszane celowo w dowolnej instancji kodu.
Kiedy mi się throw new Error('sample')
podobało w poniższym kodzie
try {
throw new Error({'hehe':'haha'});
// throw new Error('hehe');
} catch(e) {
alert(e);
console.log(e);
}
Dziennik pokazuje w przeglądarce Firefox jako Error: [object Object]
i nie mogłem przeanalizować obiektu.
Po drugie throw
dziennik pokazuje się następująco:Error: hehe
Ale kiedy to zrobiłem
try {
throw ({'hehe':'haha'});
} catch(e) {
alert(e);
console.log(e);
}
konsola pokazała jako: Object { hehe="haha"}
w której mogłem uzyskać dostęp do właściwości błędu.
Jaka jest różnica?
Czy różnica wynika z kodu? Jak ciąg zostanie przekazany jako ciąg, a obiekt jako obiekt, ale składnia będzie inna?
Nie badałem rzucania obiektu błędu… Zrobiłem tylko rzucanie strun.
Czy istnieje inny sposób niż wyżej wymienione dwie metody?
javascript
object
error-handling
exception-handling
throw
Jayapal Chandran
źródło
źródło
Error
sOdpowiedzi:
Oto dobre wyjaśnienie dotyczące obiektu Błąd i zgłaszania własnych błędów
Obiekt błędu
Co możemy z niego wyciągnąć w przypadku błędu? Obiekt Error we wszystkich przeglądarkach obsługuje następujące dwie właściwości:
name: nazwa błędu, a dokładniej nazwa funkcji konstruktora, do której należy błąd.
komunikat: opis błędu, przy czym opis ten różni się w zależności od przeglądarki.
Sześć możliwych wartości może zostać zwróconych przez właściwość name, która, jak wspomniano, odpowiada nazwom konstruktorów błędu. Oni są:
Zgłaszanie własnych błędów (wyjątki)
Zamiast czekać na wystąpienie jednego z 6 rodzajów błędów, zanim kontrola zostanie automatycznie przeniesiona z bloku try do bloku catch, możesz również jawnie wprowadzić własne wyjątki, aby wymusić to na żądanie. Jest to świetne do tworzenia własnych definicji błędów i kiedy należy przekazać kontrolę, aby ją złapać.
źródło
Error
(i podklasy) są używane przez konwencję. Domyślnie zapewniają również właściwość stosu, chociaż można ją ręcznie dodać do dowolnej innej. Tak naprawdę jest to w większości konwencja, na to, co rzucasz, nie ma wpływu na przebieg programu, tylko żethrow
we wszystkich sprawach. Mógłbyśthrow "grandmother down the stairs";
i to działałoby tak samo, z tym wyjątkiem, że nie będzie dołączonych funkcji śledzenia stosu i obsługi błędów, reporterzy, debuggeryError
lub właściwości, które są dostarczane, by być bardziej precyzyjne.rzuć „I'm Evil”
throw
będzie zakończyć dalsze wykonanie i wystawiać wiadomość ciąg na połów błąd.Konsola po rzucie nigdy nie zostanie osiągnięta z powodu zakończenia.
wyślij nowy błąd („Jestem taki słodki”)
throw new Error
ujawnia zdarzenie błędu z nazwą i komunikatem dwóch parametrów . To także kończy dalsze wykonywanieźródło
Error
, w porządku, gdzie jest połączenie z komentarzem? Połowa osób komentujących i odpowiadających na pytania PO powinna była milczeć.Used as a function
z tego linku ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…Poniższy artykuł może bardziej szczegółowo wyjaśnia, który z nich jest lepszym wyborem;
throw 'An error'
lubthrow new Error('An error')
:http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/
Sugeruje to, że ten drugi (
new Error()
) jest bardziej niezawodny, ponieważ przeglądarki takie jak Internet Explorer i Safari (niepewne wersji) nie zgłaszają poprawnie komunikatu podczas korzystania z pierwszego.źródło
Najpierw wspomnij o tym kodzie:
a następnie w pierwszym przykładzie piszesz:
Pierwszy obiekt Error faktycznie działałby, ponieważ oczekuje wartości ciągu, w tym przypadku „próbki”. Drugi nie zrobiłby tego, ponieważ próbujesz przekazać obiekt i oczekuje on ciągu.
Obiekt błędu miałby właściwość „message”, która byłaby „sample”.
źródło
toString()
metodę na przekazanym obiekcie, co powoduje[object Object]
błąd (jak napisał Op).TLDR: są równoważne.
źródło: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
źródło
możesz
throw
jako przedmiotwtedy na przykład w twoim
try/catch
lub po prostu wyrzuć błąd ciągu
źródło
The
Error
Konstruktor służy do utworzenia obiektu błędu. Obiekty błędów są zgłaszane, gdy wystąpią błędy w czasie wykonywania. Obiekt Error może być również używany jako obiekt podstawowy dla wyjątków zdefiniowanych przez użytkownika.Błędy zdefiniowane przez użytkownika są zgłaszane przez
throw
instrukcję. kontrola programu zostanie przekazana do pierwszegocatch
bloku na stosie wywołań.Różnica między zgłaszaniem błędu zi bez obiektu błędu:
W chrome devtools wygląda następująco:
Chrome informuje nas, że mamy nieprzechwycony błąd, który jest po prostu obiektem JS. Sam obiekt może zawierać informacje dotyczące błędu, ale nadal nie wiemy od razu, skąd się wziął. Niezbyt przydatne, gdy pracujemy nad naszym kodem i debugujemy go.
W chrome devtools wygląda następująco:
Błąd zgłaszany przez obiekt Error daje nam ślad stosu, gdy go rozwijamy. Daje nam to cenne informacje, z których dokładnie pochodzi błąd, które często są cennymi informacjami podczas debugowania kodu. Zwróć też uwagę, że błąd mówi
[object Object]
, że to dlatego, żeError
konstruktor oczekuje ciągu komunikatu jako pierwszego argumentu. Gdy otrzyma obiekt, zmusi go do utworzenia łańcucha.źródło
Reaguj zachowanie
Oprócz pozostałych odpowiedzi, chciałbym pokazać jedną różnicę w React.
Jeśli rzucę a
new Error()
i będę w trybie programowania, otrzymam ekran błędu i dziennik konsoli. Jeśli rzucę literał ciąg znaków, zobaczę go tylko w konsoli i być może przegapię, jeśli nie oglądam logu konsoli.Przykład
Zgłoszenie błędu rejestruje się w konsoli i wyświetla ekran błędu w trybie programowania (ekran nie będzie widoczny w środowisku produkcyjnym).
Podczas gdy następujący kod loguje się tylko do konsoli:
źródło