Very good design pattern to handle business logic exception. Yeah, those outcomes/exceptions/errors are from business logic, they are defined by developers. But what about, errors that are thrown from 3rd-party packages?
Example:
import {readSync} from 'fs'
...
const json = await readSync(pathToFile)
and somehow there is an exception throw from readSync via many reason (file not found, file corruption, some process delete it, ...). How will you handle this?