Revert using exceptions

Due to crashes. It will be reapplied once
we understand what's happening.

No functional change.
Merge remote-tracking branch 'upstream/master'