should we wrap this in a try / catch(Throwable) and call listener.onFailure(e) then?