didn't use recover because its purpose is to translate exceptions into success values, but I'm converting them into other exceptions here