There are inconsistencies with how we handle errors in iTwin.js. The goal of this issue is to be a central point to agree upon best practices, document them and gather issues pointing to code that must be updated to be consistent with best practices.
I think a general rule of thumb to start with is:
We should not throw errors for normal behavior and we should not return status in exceptional cases.