2012-10-25 10 views
21

Douglas Crockforda zaleca robić coś takiego:Rzucanie niestandardowych wyjątków w JavaScript. Który styl użyć?

throw { 
    name: "System Error", 
    message: "Something horrible happened." 
}; 

Ale można też zrobić coś takiego:

function IllegalArgumentException(message) { 
    this.message = message; 
} 

throw new IllegalArgumentException("Argument cannot be less than zero"); 

a następnie wykonaj:

try { 
    //some code that generates exceptions 
} catch(e) {  
    if(e instanceof IllegalArgumentException) { 
     //handle this 
    } else if(e instanceof SomeOtherTypeOfException) { 
     //handle this 
    } 
} 

Chyba można obejmują type Właściwość w implementacji Crockford, a następnie zbadać, zamiast robić instanceof. Czy jest jakaś korzyść z robienia jednego kontra drugiego?

+3

Dla drugiej osoby, która używa wyjątków w stylu Java, wygląda znacznie ... bardziej znajomo. – NullUserException

+1

Tak, jestem częściowy do drugiego z tego samego powodu. :) –

+4

Jestem za drugim, ponieważ jest bardziej wielokrotnego użytku pod względem czystości kodu. Mówiąc dokładniej, jeśli mam zamiar rzucić ten sam typ wyjątku w kilku miejscach, mój kod będzie bałagan (ogromny) z pierwszym podejściem. – bellpeace

Odpowiedz

24

Należy pamiętać, że w międzyczasie większość środowisk JavaScript zapewnia Error object jako podstawę wyjątków. Pozwala już zdefiniować komunikat, ale zapewnia także użyteczną właściwość stosu do śledzenia kontekstu wyjątku. Możesz utworzyć własny typ wyjątku, używając prototypowego dziedziczenia. Istnieje już kilka dyskusji na temat stackoverflow (na przykład: here), jak to zrobić właściwie. Musiałem jednak trochę wykopać, dopóki nie znalazłem właściwego i nowoczesnego podejścia. Należy pamiętać, że podejście proponowane w dokumentacji Mozilli (patrz wyżej) nie jest lubiane przez społeczność stackoverflow. Po wielu lekturze wyszedłem z tym podejściem do dziedziczenia z Error.prototype:

function IllegalArgumentException(sMessage) { 
    this.name = "IllegalArgumentException"; 
    this.message = sMessage; 
    this.stack = (new Error()).stack; 
} 
IllegalArgumentException.prototype = Object.create(Error.prototype); 
IllegalArgumentException.prototype.constructor = IllegalArgumentException; 
4

Jestem za drugim, ponieważ jest on bardziej przydatny do ponownego użycia pod względem czystości kodu. Mówiąc dokładniej, jeśli mam zamiar rzucić ten sam wyjątek (nawet ten sam typ wyjątku z inną wiadomością) w kilku miejscach, mój kod będzie bałagan (ogromny) z pierwszym podejściem.

Powiązane problemy