A closely related approach to achieving failure atomicity is to order the computation so that any part that may fail takes place before any part that modifies the object. This approach is a natural extension of the previous one when arguments cannot be checked without performing a part of the computation.
I would suggest more explicitly that you choose to allow exceptions to be thrown during computation (if it's before modification, and if there's any cost with checking separately). Don't let inefficiency on behalf of protecting from programming errors affect the performance of non-error cases (code should converge towards non-errors).