2015-02-18 22 views
5

'daki hataları yakalamıyor. ReactiveExtension gözlemcisi istisnalarını kullanırken onError eylemi tarafından yakalanmıyor. Aşağıdaki örnek kod kullanılarak, "System.Reactive.Core.dll dosyasında" System.ApplicationException "türünde işlenmeyen bir özel durum oluştu" özel durum yerine ve uygulama sonlandırılıyor. İstisna, çağrı bloğundaki her denemeyi/yakalamayı atlıyor gibi görünüyor..NET ReactiveExtension gözlemcisi, OnError

var source = Observable.Interval(TimeSpan.FromSeconds(seconds)); 
var observer = Observer.Create<long>(
    l => 
    { 
     //do something 
     throw new ApplicationException("test exception"); 
    }, 
    ex => Console.WriteLine(ex)); 
var subscription = source.Subscribe(observer); 

Gözardı edilenler tarafından istisnaların nasıl ele alınması gerektiği konusunda eksik miyim?

Eğer onNext eyleminde bir try catch koyarsam istisna tutulur ve onu kaydedebilirim.

var source = Observable.Interval(TimeSpan.FromSeconds(seconds)); 
var observer = Observer.Create<long>(
    l => 
    { 
     try 
     { 
     //do something 
     throw new ApplicationException("test exception"); 
     } 
     catch(Exception ex) 
     { 
      //exception can be caught here and logged 
      Console.WriteLine(ex); 
     } 
    }, 
    ex => Console.WriteLine(ex)); 
var subscription = source.Subscribe(observer); 

OnError eylemi tarafından yakalanan istisnanın olması için ne yapmam gerekiyor?

cevap

5

İstisnalar, yalnızca gözlemlenebilir'da yükseltildikleri takdirde yakalanırlar. gözlemcisinde gözlemcisinde yükseltildiyse, onları kendiniz yakalamanız gerekir.

Bu bir takım nedenlerden için mantıklı: Bir sıcak gözlenebilir bağlı çeşitli gözlemciler olsaydı o zaman gözlemciler biri yanlış bir şey yaptım, çünkü akışı sonlandırılır istemiyoruz

  1. .
  2. Diğer gözlemcilerin diğer gözlemcilerin çalışmalarıyla ilgili bilgi sahibi olmasını istemezsiniz
  3. Bir gözlemci bir istisna başarılı bir şekilde işledikten sonra bir gözlemci içine atılırsa, ancak bir sonraki işlemden önce gözlemlerseniz tutarsız durum.
+1

Ve en önemlisi, gözlemcinin sıcaklığına bakılmaksızın, bir gözlemcinin attığı bir istisnayla başa çıkmanın anlamlı bir yolu yoktur; Örneğin, bir hatanın gözlemlenebilir veya gözlemciden kaynaklanıp kaynaklanmadığını ayırt edemezsiniz. Bir “onError” işleyicisini belirtmek, genellikle hesaplama veya uygulamanın genel olarak tutarlı bir durumda olmasını sağlamadan değerli tanılama bilgilerini bastırır. –

+0

@DaveSexton - Çok fazla. – Enigmativity