Hallo Ferdinand,
meine Theorie ist: Du hast das alte Promise-Konzept, das vor der Einführung des async/await Zuckergusses bestand, nicht richtig verstanden.
Bei "klassischen" Promises verwendest Du kein try/catch, oder höchstens deshalb, um Fehler beim Konstruieren des Promise-Netzes abzufangen. Die eigentliche Verarbeitung findet in den then- und catch-Callbacks der Promises statt, und denen entkommt keine Exception.
Eine Exception in den Callbacks des Promise-Systems (Exekutoren, then- und catch-Callbacks) führen zu einem rejected Promise, und ein rejected Promise fängt man mit .catch() oder mit dem zweiten Parameter von .then ab. Eine JavaScript-Exception fliegt nie.
Der async/await Syntaxzucker sieht zur Behandlung von rejected Promises keine eigene Syntax vor. Deswegen musst Du bei await ein try/catch Konstrukt nutzen, um einen reject zu behandeln.
Also entweder so:
promiseSomething()
.then(result => /* use result */)
.catch(err => (handle error */)
oder so
promiseSomething()
.then(result => /* use result */, err => /* handle error */)
oder so
try {
let result = await promiseSomething()
/* use result */
}
catch (err) {
/* handle error */
}
Wobei diese drei Konstrukte nicht 100% gleichwertig sind. Nr. 1 und Nr. 3 laufen bei einer Exception im Promise-Generator UND bei einer Exception in der result-Verarbeitung in den catch. Die Nr. 2 behandelt nur einen Reject bzw. Error aus dem Executor.
Eine Exception im catch würden alle 3 als uncaught error liefern.
Ich bin längst nicht fertig mit dem Artikel, aber hier steht schon einiges darüber.
Rolf
sumpsi - posui - obstruxi