Yes, you can certainly send an email to the user; in fact, this is my preferred method to avoid spamming users. You can do this by way of the Database.Stateful.
public class MyBatchable implements Database.Batchable<SObject>, Database.Stateful {
Exception[] errors = new Exception[0];
public Iterable<SObject> start(...) {
...
}
public void execute(...) {
try {
...
} catch(Exception e) {
errors.add(e);
}
}
public void finish(...) {
if(!errors.isEmpty()) {
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setSubject('Errors occurred during batch process.');
mail.setTargetObjectId(UserInfo.getUserId());
mail.setSaveAsActivity(false);
mail.setPlainTextBody(buildBodyFor(errors));
Messaging.sendEmail(new Messaging.Email[] { mail });
}
}
}
You might also include a way to send emails if too many errors have stacked up, or limit yourself to some number of exceptions (say, the first 50 or 100). Keep in mind that you do have a limited amount of memory available, so if you're concerned about having a large number of errors, consider logging them to the database and then querying them back in your finish method.