TL;DR; Помилка у
await someAsyncFn().catch() створює Unhandled Promise Rejection, тобто аргумент у catch() є обов'язковим.
Я вже розповідав про
Floating Promise. Вони створють Unhandled Promise Rejection. Щоб знаходити такі проблеми я використовую
@typescript-eslint/no-floating-promises. Це правило говорить, щоб не було Floating Promise треба зробити одне з:
–
await цього promise-а
–
return цього promise-а
– додати до цього promise chain
.then() з двома аргументами
– додати до цього promise chain
.catch() з одним аргументом
Я вважав, що
try catch та
catch у promise chain працюють однаково. Тому для мене було несподіванкою, що
await someAsyncFn().catch() не перехоплює помилку, що створює Unhandled Promise Rejection. Так само станеться якщо аргумент у
catch буде
null або
undefined.
Catch це синтаксичний цукор
then(undefined, cb). Змінюючи цей
cb ми контролюємо поведінку promise chain, тому
cb не є обов'язковим.
Для мене це виглядає, як бага у
@typescript-eslint/no-floating-promises. Як тимчасове рішення я додав таке правило:
'no-restricted-syntax': [ 'error', { selector: "CallExpression[callee.property.name='catch'][arguments.length!=1]", message: 'Catch should have exactly one argument' }],PS Велика подяка Віктору та Олексію за коментарі.