Eventually what we want is for a UDF to be able to return 3 levels of errors:
WARN - I couldn't process this record, so we should put a null here and keep going. This can be communicated by the UDF returning null once we have them. Ideally we'd like an explicit return code for this so that we can log a warning.
ERROR - I couldn't process this record and we should give up on this execution attempt. That's the default behavior now, and what we should continue to do for now.
FATAL - I couldn't process this record and we should give up the job entirely (ie no retries). This would only be used in cases where we know retries will be of no use, for example if we find we have an incompatible version of the UDF loaded or something. There's no way to do this now.
All this is a long way to say that, given we don't yet have nulls, the best we can do right now is error out when we get an IOException.