2012-01-09 23 views
2

嗨我打电话给Web服务的一些项目,当他们回来时,我创建了一个界面,适合在一个单独的方法返回的项目。现在,每当出现问题时,我都需要捕捉异常并向用户显示消息。调用try方法时不捕获异常?

private void itemHelper_FeaturedItemsCalled(object sender, List<MyItem> _myItemList) 
{ 
    try 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      if(_myItemList != 0) 
       CreateInterface(_myItemList); 
     }); 
    } 
    catch 
    { 
     Dispatcher.BeginInvoke(() => 
     { 
      LoadingScreen.Visibility = System.Windows.Visibility.Visible; 
      LoadingTextBlock.Text = "Unable to display items."; 
      BusyIndicator1.IsRunning = false; 
     } 
    } 
} 

现在我特意方法CreateInterface()内抛出异常。现在,当这个运行我得到和未处理的异常。这是为什么?我以为这个方法在尝试中被调用,它最终会在这里被处理?

+2

一个不同的线程用于运行'BeginInvoke'调用的委托,所以异常在那里引发并且未处理。 – 2012-01-09 14:49:31

回答

4

尝试把尝试捕捉的BeginInvoke的内部。发生什么事是你在不同的线程上执行这段代码,所以异常不会被不同的线程捕获。

+0

+1简单的解决方案。 – loyalpenguin 2012-01-09 15:06:57

7

通过调用BeginInvoke即表示您在“在调度程序线程中执行此代码”。 BeginInvoke是异步的,所以整个方法可能会在代码执行之前完成 - 那么它怎么可能进入catch块呢?到那时调用线程可能会处于完全不同的代码段。

这是可能,如果你使用Invoke而不是BeginInvoke可能得到整理返回给调用者除外 - 但它是我看不到任何证据的文档。

编辑:此外,即使你已经设法捕获异常,你会访问来自错误的线程的UI在这一点......

+0

感谢您的回答。我有一个想法,BeginInvoke是问题,但现在我知道为什么。如果我在BeginInvoke中调用try/catch,它会捕获异常。 – loyalpenguin 2012-01-09 14:55:02

+0

@loyalpenguin:请参阅我的编辑,了解一个重要的附加点 - 您在catch块中的代码需要另一个Invoke/BeginInvoke调用。 – 2012-01-09 15:15:16

+0

是非常好的一点。对不起,我忙于尝试替换删除第二个BeginInvoke的原始值。我会解决它。我想通过将所有内容放在一个BeginInvoke中,我可以删除该问题。我只是希望通过运行BeginInvoke里面的所有东西来避免资源瘫痪...... – loyalpenguin 2012-01-09 15:20:19