return Error via callback instead of throwing