2012-01-09 3 views
2

Привет Я вызываю некоторые элементы из веб-службы, и когда они возвращаются, я создаю интерфейс, адаптированный к элементам, возвращаемым внутри отдельного метода. Теперь каждый раз, когда что-то идет не так, и мне нужно поймать исключение и отобразить сообщение пользователю.Не вызывается исключение, когда вызывается метод с вызовом 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', поэтому исключение создается там и не обрабатывается. –

ответ

4

Попробуйте положить попробовать поймать внутри BeginInvoke. Что происходит, так это то, что вы выполняете этот код в другом потоке, поэтому исключение не попадает в различный поток.

+0

+1 Простое решение. – loyalpenguin

7

По телефону BeginInvoke вы говорите: «Выполните этот код в потоке диспетчера». BeginInvoke является асинхронным, поэтому весь метод, вероятно, будет завершен до того, как код будет выполнен - ​​так как он может попасть в блок catch? К тому времени вызывающий поток, вероятно, будет в совершенно другой части кода.

Это возможный, что если вы используете Invoke вместо BeginInvokeвы могли бы получить исключение ранжированы обратно к абоненту - но это я не вижу каких-либо доказательств того, что из документации.

EDIT: Кроме того, даже если вы уже удалось поймать исключение, вы бы получить доступ к UI от неправильной нити в этой точке ...

+0

Спасибо за ответ. У меня возникла идея, что проблема BeginInvoke была проблемой, но теперь я знаю, почему. Если я вызову try/catch внутри BeginInvoke, он поймет исключение просто отлично. – loyalpenguin

+0

@loyalpenguin: см. Мое редактирование для важной дополнительной точки - для кода, который у вас есть в вашем блоке catch, потребуется другой вызов Invoke/BeginInvoke. –

+0

Да отличная точка. Извините, я был настолько занят, пытаясь заменить исходные значения, которые я удалил второй BeginInvoke. Я исправлю это. Я думаю, разместив все внутри одного BeginInvoke, я мог бы удалить эту проблему. Я просто надеюсь, что нет ресурсов для ресурсов, запустив все внутри BeginInvoke ... – loyalpenguin

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