A differenza del C ++, perché l'eccezione non rilevata in JavaScript non termina lo script?

1

Come qualcuno abituato a C ++ e nuovo a JavaScript, trovo questo comportamento strano. Sia che un programma sia eseguito direttamente sulla piattaforma come in C ++, sia che funzioni a un livello più alto (o più profondo?) Come quelli JavaScript, concettualmente, un programma, un programma e un'eccezione sono un'eccezione. Allora perché JavaScript ha questo comportamento? La definizione JavaScript di eccezione è diversa?

Guarda questo semplice esempio.

<!doctype html>
<html>
<body>
<button id="throw">Throw Exception</button>
</body>
<script>
document.getElementById("throw").onclick = function(){
throw "Uncaught Exception";
}
</script>
</html>

Quando si fa clic sul pulsante, la console visualizza "eccezione non rilevata: eccezione non rilevata" come previsto. Tuttavia, facendo nuovamente clic sul pulsante anche dopo, viene generata un'eccezione, ovvero l'esecuzione dello script non è bloccata. Se fosse stato C ++, il programma sarebbe finito. Il fatto che funzioni all'interno di un browser non dovrebbe avere importanza perché il browser può semplicemente interrompere lo script e avvisare l'utente; dopotutto, il browser si comporta come la piattaforma dello script.

Voglio sapere la ragione di questo.

Esiste un tipo di libro "The Design and Evolution of JavaScript" in cui possiamo capire perché le cose sono come sono?

    
posta vin 16.07.2016 - 10:03
fonte

3 risposte

9

Una delle principali differenze tra i programmi C ++ e gli script Javascript è che un programma C ++ viene eseguito generalmente per un tempo molto più lungo di uno script Javascript.
Un programma C ++ con una GUI viene eseguito continuamente mentre si lavora con il programma. D'altra parte uno script Javascript viene eseguito solo per un breve periodo di tempo per rispondere a un evento e poi finisce (anche se non genera un'eccezione).

Un'eccezione non rilevata in uno script Javascript causa la chiusura dello script , ma il browser che esegue lo script non ricorda che è terminato in modo anomalo. Ciò significa che quando il pulsante viene premuto di nuovo, il browser semplicemente eseguirà nuovamente lo script .
In questo modo, è completamente paragonabile al riavvio di un programma C ++ dopo il suo arresto anomalo.

    
risposta data 16.07.2016 - 13:10
fonte
2

Questo non è affatto vero. L'eccezione JS non è minimamente compromessa. È semplicemente catturato dal browser. Una libreria UI C ++ può banalmente produrre lo stesso effetto chiamando il gestore onClick all'interno di un try / catch.

La differenza di comportamento non ha nulla a che fare con il linguaggio: è tutta la libreria.

    
risposta data 16.07.2016 - 11:24
fonte
2

La differenza non è nelle lingue ma nell'ambiente di esecuzione. La differenza fondamentale è che stai usando C ++ come programma stand-alone. Ciò significa che un'eccezione non risolta interromperà il programma. Esattamente lo stesso accadrà se esegui un programma JavaScript come script autonomo e c'è un'eccezione non rilevata.

Ma stai confrontando un programma stand-alone con JavaScript incorporato in esecuzione nel browser. Funziona in modo diverso poiché il JavaScript incorporato non è un programma singolo in sé.

I gestori di eventi JavaScript vengono eseguiti dal motore del browser che gestisce anche il rendering di CSS / HTML, l'interazione dell'utente, il traffico di rete e così via. Quando il motore esegue un gestore di eventi, le eccezioni non rilevate nel codice JavaScript interrompono l'esecuzione del codice del gestore di eventi, ma non interrompono il motore del browser, poiché ciò significherebbe che uno script nella pagina Web potrebbe causare il blocco del browser.

È una caratteristica fondamentale delle eccezioni che possono essere catturate e gestite (o ignorate) a qualsiasi livello nello stack di chiamate sopra il punto in cui viene generata l'eccezione. Puoi fare la stessa cosa in C ++ con try / catch .

Sembra che tu suggerisca "che lo script" nel suo complesso debba essere terminato, cioè che tutto il JavaScript nella pagina debba essere disabilitato. Ma questo non è esattamente il modo in cui funzionano le eccezioni. Le eccezioni viaggiano verso l'alto nello stack delle chiamate, non "lateralmente". I gestori di eventi JavaScript vengono richiamati dal motore del browser, il che significa che le eccezioni non gestite dovrebbero in teoria viaggiare e causare la chiusura del motore del browser. Ma se vengono rilevate e gestite eccezioni, non vi è alcun motivo per cui altri gestori di eventi debbano essere interessati.

    
risposta data 16.07.2016 - 11:48
fonte

Leggi altre domande sui tag