我们一直在使用未处理的例外情况,我们同时注册AppDomain.CurrentDomain.UnhandledException
和AllowDrop
但是以下使用Drop Event处理程序的repro情况不会触发任何未处理的异常处理程序。
当我从UI或任务中抛出异常时,会触发一些处理程序,但是形成文档我不理解为什么在我的场景中没有触发处理程序,因为我希望Dispatcher调用DispatcherUnhandledException
这是VS 2015与.net 4.5.2
Repro WPF代码非常简单,只有Drop
和<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>
处理程序。注意:处理程序在窗口ctor中注册,在app.xaml.cs中执行此操作时的行为相同。
只需拖动&amp;将任何文件放入其中,应该出现一个消息框,但不会出现。
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}}
答案 0 :(得分:1)
如果要在drop事件期间处理异常,则必须在Drop事件处理程序中处理它。有关原因的更多信息,请参阅MSDN论坛以下主题中的Peter Ritchie的回答:https://social.msdn.microsoft.com/Forums/windows/en-US/8beb1aba-1699-46c7-84dc-38768c7a21f6/treeview-dragdrop-event-ignores-exceptions-help?forum=winforms
Jay Wang(MSFT)在WPF论坛中证实了这一点:https://social.msdn.microsoft.com/Forums/vstudio/en-US/a336acc8-5a29-45aa-b84a-8e235a0f838a/wpf-drop-event-hides-thrown-error?forum=wpf