The best thing about dd is that you can use it with conv=noerror, which will let you recover as much data as possible from an otherwise damaged device.
ddrescue or recoverdisk (part of FreeBSD base) will both skip over unreadable blocks, then retry with smaller block sizes along the damaged areas to save as much data as possible.
The arch wiki page is very useful: https://wiki.archlinux.org/index.php/disk_cloning