Как обработать исключение, используя класс Timer (Thread) - PullRequest
2 голосов
/ 23 марта 2011

Я пытаюсь обработать исключение Timer.Было бы хорошо, если бы у класса было что-то вроде HandlerExceptionEvent, чтобы мы могли добавить какое-либо событие для записи чего-либо или остановить таймер.

PS: я не хочу добавлять try / catch блок внутри ElapsedEventHandler().

class Program
{
static void Main(string[] args) {
  System.Timers.Timer t = new System.Timers.Timer(1000);
  t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
  t.Start();     

  System.Threading.Thread.Sleep(10000);
  t.Stop();
  Console.WriteLine("\nDone.");      
  Console.ReadLine();
}

 static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
   Console.WriteLine("Ping!");
   throw new Exception("Error!");
 }
}

1 Ответ

11 голосов
/ 23 марта 2011

PS: я не хочу добавлять исключение try / catch внутри ElapsedEventHandler ()

Поскольку класс Timer не поддерживает такое событие, как иначе вы бы поймалиисключение?

Если вы настаиваете на использовании класса Timer, то, возможно, это ваш единственный вариант:

var t = new System.Timers.Timer(1000);
t.Elapsed += (sender, e) => { 
    try 
    { 
        t_Elapsed(sender, e); 
    } 
    catch (Exception ex) 
    { 
        // Error handling here...
    } 
};

Таким образом, фактический обработчик t_Elapsed не содержит обработки ошибок иВы можете создать класс-оболочку для класса Timer, который скрывает эту деталь реализации и, в свою очередь, предоставляет событие для обработки исключений.

Вот один из способов сделать это:

class ExceptionHandlingTimer
{
    public event Action<Exception> Error;

    System.Timers.Timer t;

    public ExceptionHandlingTimer(double interval)
    {
        t = new System.Timers.Timer(interval);
    }

    public void Start()
    {
        t.Start();
    }

    public void AddElapsedEventHandler(ElapsedEventHandler handler)
    {
        t.Elapsed += (sender, e) =>
        {
            try
            {
                handler(sender, e);
            }
            catch (Exception ex)
            {
                if (Error != null)
                {
                    Error(ex);
                }
                else
                {
                    throw;
                }
            }
        };
    }
}
...