Hmm. I wonder what sort of "errors" the OP is referring to. Some errors can be immediate (eg. failed to connect to smtp server) - we could catch these and prevent the user object from being created. For errors that are delayed (due to queuing, incorrect sender, bounces, etc.), there's nothing much we can do.
I think we could have a page in the admin to allow shop owners to re-send the activation email. This would solve both of these situations.
How is this issue by nowadays? I was thinking about it, and found a good option:
If an inactive/unconfirmed user try to login, he receives the option (a link) to send the confirmation to active "again".
At the right side in the administrative interface, the staff can see how many inactive users they have and manual activate some users, just by looking their e-mails.
We can have a cronjob that try to send e-mail to inactive users by X times.
The solution proposed 1-3 solves the problem, I think, but the first item almost solve 95% of e-mails problem cases.
I don't think we should cancel the User registration, to him try again, because he needs to type the form again and we don't have information to send the activation e-mail again.
ad 1) Good point. And some users try to register again. They need the same hint as for login.
ad 3) Cronjob is not important because it would only duplicate what mail server does better, with a resolution of permanent and transient faults. Graylisting on some servers can slow down all emails. A lazy inactive user should not then be bombarded X times by email.
Advanced users retry registration with other email usually because it if faster then wait.