2013-12-14 16 views
8

Bir istisna ile nasıl başa çıkılacağı konusunda biraz kafam karıştı.Arka plan çalışanı özel durum işlenmesi

Uzun süren bir işlem yürüten bir arka plan iş parçacığım var. Benim anlayışım arka plan çalışan iş parçacığı üzerinde bir özel durum ortaya çıkarsa, kod hala RunWorkerCompleted yönteminde sona erecektir. Bu durumda bgWorker.RunWorkerAsync etrafında bir deneyin catch bloğu koyarak bir anlamı yoktur edilir ise

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

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

(); çağrı, ben değil mi?

RunWorkerCompleted yönteminde yakalanan istisnayı yeniden değerlendirmek istiyorum, bunu yığın izini kaybetmeden nasıl yapabilirim - doğru olanı nedir? Bir istisna atarken sadece "atma" kullanmanız gerektiğini okudum?

cevap

13

gibi bir şey yapabilirsiniz. onun yığın izleme

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

Böylece orijinal istisna mevcut olacak ve daha açıklayıcı özel durum olur: Ve iç istisna olarak orijinal haricinde bu istisna.

Not - Yeni bir istisna sınıfı oluşturmak istemiyorsanız, mevcut ApplicationException veya Exception'u kullanabilirsiniz. değil bilgilendirici ve bir yere yakalamak için gidiyoruz, o zaman sadece

2

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

bir yöntem (değil an event) var bgWorker.RunWorkerAsync(); çünkü Hayır bunu yapamaz. f Visual Studio hata ayıklayıcısını çalıştırıyorsanız, hata ayıklayıcısını işlenmeyen özel durumun yükseltildiği DoWork olay işleyicisindeki noktadan kopar. Yani ben size arka planda yaptıklarını operasyonu tanımlayan bazı iş özgü istisna oluşturmak için önermek bu

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

deneyin bu özel durum yakalamak mümkün olmayabilir olacak ama onun Etmezdim Benim RunWorkerCompleted yöntemimde herhangi bir hata işlemek gerekir? Veya RunWorkerCompleted yöntemindeki herhangi bir hatayla başa çıkmak daha iyi bir uygulama mı? – mHelpMe

+0

İş parçacığınızdaki özel durumla başa çıkacaksanız, bunu RunWorkerCompleted'e alamayacaksınız ve eğer DoWork'ta kullanamıyorsanız, yanlış bir şey yaparsanız uygulamanız çökebilir –

7

bu durumda bu nedenle bu

void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

     if (e.Error != null) 
      throw new Exception("My Custom Error Message", e.Error);