aiono, Great blog post about how to design error handling https://keleshev.com/composable-error-handling-in-ocaml. It specifically talks about OCaml but I think the tradeoffs are valid for any general purpose programming language. The option that author thinks the best is also the same scheme that I considered in the past as the ideal way to denote errors in type signatures.