2017-01-18 5 views
1

Мы использовали неиспользуемые исключения для возрастов, и мы регистрируем как Application.Current.DispatcherUnhandledException, так и AppDomain.CurrentDomain.UnhandledException , но следующий пример воспроизведения с использованием обработчика Drop Event не вызывает никакого обработанного обработчика исключений.Необработанное исключение, не пойманное обработчиком

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

Это VS 2015 с .net 4.5.2

Repro Код WPF очень прост, только AllowDrop и Drop обработчик. Примечание. Обработчики регистрируются в окне ctor, такое же поведение при выполнении этого в app.xaml.cs.

Просто перетащите & вставьте в него любой файл, появится окно с сообщением, но оно не отображается.

<Window x:Class="unhandledex_wpf.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" AllowDrop="True" Drop="MainWindow_OnDrop"> 
    <Grid> 

    </Grid> 
</Window> 

код позади:

using System;using System.Threading.Tasks;using System.Windows; 

namespace unhandledex_wpf 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      Application.Current.DispatcherUnhandledException += (sender, args) => MessageBox.Show("Exception"); 
      AppDomain.CurrentDomain.UnhandledException += (sender, args) => MessageBox.Show("Exception"); 
      TaskScheduler.UnobservedTaskException += (sender, args) => MessageBox.Show("Exception"); 

      // works Task.Run(()=> { throw new Exception("foo"); }); 
     } 

     private void MainWindow_OnDrop(object sender, DragEventArgs e) 
     { 
      throw new NotImplementedException("Catch me"); 
     } 
    } 
} 

ответ

1

Если вы хотите обработать исключение во время события перетаскивания вы должны обрабатывать его в пределах обработчика событий падения. Пожалуйста, обратитесь к ответу Питера Ритчи в следующей теме на форумах MSDN для получения дополнительной информации о том, почему: https://social.msdn.microsoft.com/Forums/windows/en-US/8beb1aba-1699-46c7-84dc-38768c7a21f6/treeview-dragdrop-event-ignores-exceptions-help?forum=winforms

Джей Ван (MSFT) подтвердил это в форуме WPF: https://social.msdn.microsoft.com/Forums/vstudio/en-US/a336acc8-5a29-45aa-b84a-8e235a0f838a/wpf-drop-event-hides-thrown-error?forum=wpf

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