Stores the given throwable and rethrows it. It will be rethrown as is if it is an {@code IOException}, {@code RuntimeException} or {@code Error}. Otherwise, it will be rethrown wrapped in a {@code RuntimeException}.
Note: Be sure to declare all of the checked exception types your try block can throw when calling an overload of this method so as to avoid losing the original exception type.
This method always throws, and as such should be called as {@code throw closer.rethrow(e);} to ensure the compiler knows that it will throw.
@return this method does not return; it always throws
@throws IOException when the given throwable is an IOException