Not mentioned so far is dd_rescue,
http://www.garloff.de/kurt/linux/ddrescue/
It copies in large chunks until an error is seen, then backs off to
smaller reads, attempting to get what it can. You can restart a copy
from a new point, which extends the current dump file
to skip the area
that hasn't been (or couldn't be) read. You can also read
in reverse,
backing up from the end of the media to the point of an error.
There's a gnu program that does the same things, ddrescue
http://www.gnu.org/software/ddrescue/ddrescue.html. It seems to be
slightly more automatic, but similar in operation to dd_rescue.
-Rick