Credo che gran parte del motivo per cui try..catch
sia raro in JavaScript è dovuto al fatto che il linguaggio ha una tolleranza piuttosto elevata per l'errore. La maggior parte delle situazioni può essere gestita utilizzando i controlli del codice, le impostazioni predefinite e gli eventi asincroni. In alcuni casi, semplicemente utilizzando un modello si evitano problemi:
function Foo() {
//this may or may not be called as a constructor!!
//could accidentally overwrite properties on window
}
function Bar() {
if (!(this instanceof Bar)) {
return new Bar();
}
//this will only work on Bar objects, and wont impact window
}
Alcuni dei principali problemi in altre lingue che causano la comparsa di eccezioni semplicemente non esistono in JS. Il casting di tipo non è necessario per la maggior parte del tempo. Invece, il metodo preferito è tipicamente il controllo delle funzionalità (applica una particolare interfaccia):
function doFoo(arg) {
if (arg.foo) {
arg.foo();
} else {
Bar.prototype.foo.call(arg);
}
}
Con l'aggiunta di async
/ await
alla lingua, try..catch
sta diventando più prevalente. Promette di essere la forma asincrona di try..catch
, ha senso che ci si aspetti:
doSomething().then(
doSomethingWithResult,
doSomethingWithError
)
invece di essere scritto come:
try {
const result = await doSomething()
doSomethingWithResult(result)
} catch (e) {
doSomethingWithError(e)
}