2014-12-04 5 views
0

Почему try-catch базового класса не получает исключение, созданное в производном классе? Я что-то пропустил?Не удается поймать исключение, вызванное производным классом

Базовый класс:

public class UmBase 
{ 
    protected Thread ThisThread; 

    protected UmBase(int cycleMs, UpdateManager updateManager, 
        string loggerFilename, string loggerFolder = "UpdateManager") 
    { 
    } 

    public void Start() 
    { 
     ThisThread = new Thread(Work); 
     ThisThread.Start(); 
    } 

    public virtual void Iteration() 
    { 
     throw new Exception("Iteration Method should be overidden!"); 
    } 

    public void Work() 
    { 
     while (IsProcessing) 
     { 
      try 
      { 
       Iteration(); 
      } 
      catch (Exception exception) 
      { 
       Log.Error(exception.Message); //WANT TO HANDLE IT HERE 
      } 
      finally 
      { 
       Sleep(100); 
      } 
     }; 
    } 
} 

производный класс:

public class ReadParams : UmBase 
{ 
    public ReadParams(UpdateManager updateManager, int cycleMs = 60000) 
     : base(cycleMs, updateManager, "sss") 
    { 
     Iteration(); 
    } 

    public override void Iteration() 
    { 
     try 
     { 
      DbParams.Set(); //EXCEPTION IS THROWN INSIDE 
     } 
     catch (Exception exception) 
     { 
      throw new Exception("Oops!", exception); 
     } 
    } 
} 

Я прочитал здесь Can we catch exception from child class method in base class in C#? и не может найти свою ошибку.

+0

Возможный дубликат [Как исключение из конструктора в производном классе с C#?] (Http://stackoverflow.com/questions/17266105/how-to-catch-exception-from-a-constructor-in -a-производный класс с-с) – Brian

ответ

3

Try/Catch будет перехватывать исключения только в блоке try. Это включает любые исключения, вызванные другими методами, вызываемыми в блоке try. У вас есть исключения, сконфигурированные для разрыва только необработанных или также на thrown? See here for how to configure exception breaks

Другая возможность заключается в том, что ваше исключение бросается во время построения объекта, потому что ваш конструктор ReadParams вызывает Iteration() без try/catch.

т.е.

public class ReadParams : UmBase 
{ 
    public ReadParams(UpdateManager updateManager, int cycleMs = 60000) 
     : base(cycleMs, updateManager, "sss") 
    { 
     Iteration(); 
    } 

    public override void Iteration() 
    { 
     try 
     { 
      // If throw here (A) 
      DbParams.Set(); //EXCEPTION IS THROWN INSIDE 
     } 
     catch (Exception exception) 
     { 
      // I'll catch here (A) and then throw a new exception 
      throw new Exception("Oops!", exception); 
     } 
    } 
} 

public void Work() 
{ 
    while (IsProcessing) 
    { 
     try 
     { 
      // Exceptions thrown here including the one you 
      // threw in the method Iteration (B) 
      Iteration(); 
     } 
     catch (Exception exception) 
     { 
      // Will be caught here (B) 
      Log.Error(exception.Message); //WANT TO HANDLE IT HERE 
     } 
     finally 
     { 
      Sleep(100); 
     } 
    }; 
} 
0

При использовании метода override вы фактически заменяете весь метод оптовой продажей по отношению к экземплярам производного класса.

Если вы не вызываете унаследованный метод явно из переопределенного, это не является частью логики вашего производного класса.

2

Если я прочитал это правильно, то последовательность:

  1. ReadParams CTOR
  2. UmBase CTOR
  3. ReadParams итерационного
  4. ReadParams Итерация throw new Exception("Oops!", exception);
  5. Crash ... потому что в ReadParams нет попытки захвата ctor
-1

Я столкнулся с такой же проблемой. Я заметил одну вещь, но не уверен в причине. Когда u наследует базовый класс в частном порядке, его блок catch не захватывает исключение производного класса. публично наследует базовый класс и дайте ему попробовать.

Смежные вопросы