Я не уверен, что «отказоустойчивый» - лучший способ описать эту методологию, но с тех пор, как я начал изучать программирование, меня всегда учили проектировать такие функции:
function doSomething() {
... // do error-prone work here
if (!allGood) {
// Report error, cleanup and return immediately. Makes for cleaner,
// clearer code where error-handling is easily seen at the top
...
return;
}
// Success! Continue on with (potentially long and ugly) code that may distract from the error
}
Как таковой, я пытаюсь вызвать обещанную функцию следующим образом:
doSomethingAsync(param).catch(err => {
console.error(err);
}).then(() => {
// Continue on with the rest of the code
});
Но это дает мне поведение, похожее на блок finally
оператора classi c try...catch...finally
, т.е. блок then()
будет вызываться всегда , даже после ошибки. Иногда это полезно, но я редко нахожу себя нуждающимся в такой функциональности (или, вообще говоря, try...catch
заявлениях).
Так что в интересах сбоя настолько быстро и ясно, насколько это возможно, есть ли способ что я могу заставить второй пример выше работать так, как я ожидаю (то есть then()
выполняется только в том случае, если catch()
не было, но один catch()
по-прежнему будет перехватывать все ошибки, выданные doSomethingAsync()
)?