Timer (and all jobs) have a default retry-count of 3. When this is done, and 3 times failes, the timer won't be fired again (to prevent jobexecutor being flooded with failing jobs all the time, making it slow).
You can, however, query for jobs that have no retries left (using ManagementService and JobQuery) and check what exception occured. Based on that, you can decide to run them again (ManagementService.executeJob). This you can do for example, in a quartz job…