Why is the `raise` in the `ensure` clause?  Why not put it right after `what_to_raise`?  It seems odd to go through the trouble of `eval`ing the block, etc, only to `raise` in `ensure`.  Plus, given that `ensure` is for cleanup (e.g. for when there may be an exception that's already propagating up the stack) it seems risky to raise an error.

Actually, I'd prefer the `what_to_raise` and `raise` logic extracted into a `prevent_invalid_expectation` helper method called from above.