2013-12-14 4 views
8

Я немного смущен тем, как бороться с исключением.Обработка обработки исключений для фона

У меня есть рабочий рабочий поток, который выполняет некоторый длительный процесс. Мое понимание заключается в том, что в случае фонового рабочего потока возникает исключение, код будет по-прежнему в методе RunWorkerCompleted.

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw e.Error; 

Если это так есть ли смысл в положить попробовать поймать блок вокруг bgWorker.RunWorkerAsync(); звоните, я полагаю, нет?

Я хочу перестроить исключение, которое попало в метод RunWorkerCompleted, как я могу это сделать, не теряя трассировку стека - это то, что у меня выше правильного? Я читал, что вы, редуцируя исключение, должны просто использовать «бросок»?

ответ

13

Я предлагаю вам создать некоторые бизнес конкретное исключение, которое описывает операцию, которую вы делали в фоновом режиме. И выбросить это исключение с оригинальным исключением, как внутреннее исключение:

private void bgWorker_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error != null) 
     throw new BusinessSpecificException("Operation failed", e.Error); 
    // ... 
} 

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

Примечание. Если вы не хотите создавать новый класс исключений, вы можете использовать существующие ApplicationException или Exception. Но его не так информативны, и если вы собираетесь поймать его где-то, то вы не будете в состоянии поймать это особое исключение только

2

If this is the case is there any point in putting a try catch block around the bgWorker.RunWorkerAsync(); call, I assume not?

Нет, вы не можете сделать это, потому что bgWorker.RunWorkerAsync(); это метод (не an event). Если вы работаете под отладчиком Visual Studio, отладчик будет разбит в точке обработчика событий DoWork, где было обработано необработанное исключение. Таким образом, вы можете сделать что-то вроде этого

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
      { 
       //put your break point here 
       // here you can capture your exception 
      } 
      catch (Exception ex) 
      { 
       // here catch your exception and decide what to do     
       throw; 
      } 



     } 
+0

поэтому в данном случае я бы не стал нужно ли выполнять обработку ошибок в моем методе RunWorkerCompleted? Или лучше ли справляться с любыми ошибками в методе RunWorkerCompleted? – mHelpMe

+0

, если вы обрабатываете исключение в рабочем потоке, вы не сможете получить его в RunWorkerCompleted, и если вы не будете обрабатывать его в DoWork, ваше приложение может потерпеть крах, если вы сделаете что-то не так –

7

Попробуйте

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw new Exception("My Custom Error Message", e.Error); 
Смежные вопросы