A CRC in general isn't well suited for error correction, just detection.
Any redundancy you add to an original data block is limited in the amount of errors it can detect (or correct).
Any practical transmission channel has a statistical error rate greater than zero. Cleverly constructed redundant data can decrease the probability of an error by several orders of magnitude, but no amount of redundancy can reduce that probability to zero.
In practice, you might want to reduce an error rate to an amount that doesn't matter much any more - most Ethernet variants are designed to guarantee a bit error rate of 10-12 or better. Detecting an error is much easier than correcting it, so in some situations it might be more reasonable to drop erroneous data and try again. Ethernet doesn't try again on FCS errors but some higher-layer protocols resend lost data.
For an example on forward error correction, check out https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction