How to skip files with ditto command line utility?
I've worked around the problem by booting on the failing drive and copying to the external drive.

I still get the I/O errors when attempting to read the same files, but at least the drive does not eject (and the system does not crash) so I was able to go through with ditto and ignoring/logging files in error.



Otherwise, the answer to my original question seems to lie with rsync:

rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination


or:

rsync -av --exclude-from=FILE source destination


See this answer for more information.