I think throwing away the draft on publish has no real purpose other than perhaps making the user certain that there's no unpublished changes (and is a noisy way to make that determination).

I agree, if we're catching the exception, it should be per item and not crap out the recurse. To be complete, should the other _xmodule_recurse calls in this section also catch their respective exceptions and continue?