To plug my own solution, my effect system Bluefin makes exceptions visible in the type, well-scoped, and also freely composable with all other effects:
https://hackage.haskell.org/package/bluefin-0.0.3.0/docs/Blu...
https://hackage.haskell.org/package/bluefin-0.0.3.0/docs/Blu...
I strongly believe that there is a point in the PL design space that makes optionals everywhere usable. Maybe Haskell can still be the language that delivers this.