On the other hand, if you are writing library code or even a library-ish component of application code, having to write the same method a bunch of different times is tedious. Ideally, the language would be designed so that there is one sane way of propagating errors, which can be easily either handled or propogated.
I am quite a fan of Rust's solution, with Result<T> types and various macros/methods which can do the commmon stuff for you