C# 执行拖放操作时发生异常

C# 执行拖放操作时发生异常,c#,winforms,exception,drag-and-drop,C#,Winforms,Exception,Drag And Drop,我有一个WinForms应用程序,我在两个TreeView之间进行拖放操作 在某个时候,我想拒绝底层业务实现中的操作,所以我抛出了一个异常。我可以在输出窗口中看到异常,但问题是我在UI中看不到它,它也不会崩溃 例外情况到哪里去了 下面是一些描述问题的代码: private TreeView tvLeft; private TreeView tvRight; private Dictionary<string, int> dico = new Dictionary<string,

我有一个WinForms应用程序,我在两个TreeView之间进行拖放操作

在某个时候,我想拒绝底层业务实现中的操作,所以我抛出了一个异常。我可以在输出窗口中看到异常,但问题是我在UI中看不到它,它也不会崩溃

例外情况到哪里去了

下面是一些描述问题的代码:

private TreeView tvLeft;
private TreeView tvRight;
private Dictionary<string, int> dico = new Dictionary<string, int>();

void tvLeft_DragDrop(object sender, DragEventArgs e) {

  if (e.Data.GetDataPresent(typeof(TreeNode))) {

    var tnSource = (TreeNode) e.Data.GetData(typeof(TreeNode));
    var tnDestination = tvLeft.GetNodeAt(tvLeft.PointToClient(new Point(e.X, e.Y)));

    // if I drag-drop the same node twice, there sould be an Exception
    // since the key is already in the dictionary...
    // ...but I get no Exception in the UI, the Application.ThreadException
    // or Appomain.CurrentDomain.UnhandledException handlers
    dico.Add(tnSource.Name, (new Random()).Next());

  }

}
private TreeView tvleet;
私人树景电视转播权;
专用字典dico=新字典();
void tvLeft_DragDrop(对象发送器,DragEventArgs e){
if(例如Data.GetDataPresent(typeof(TreeNode))){
var tnSource=(TreeNode)e.Data.GetData(typeof(TreeNode));
var tnDestination=tvleet.GetNodeAt(tvleet.PointToClient(新点(e.X,e.Y));
//如果我拖放同一个节点两次,就会出现异常
//由于密钥已在字典中。。。
//…但我在UI中没有发现异常,即Application.ThreadException
//或Appomain.CurrentDomain.UnhandledException处理程序
添加(tnSource.Name,(new Random()).Next());
}
}

异常可能发生在某个后台线程上。您需要为AppDomain.CurrentDomain.UnhandledException或Application.ThreadException事件创建处理程序


有关更多详细信息,请参阅。

我在互联网上找到了以下解释:

即使在同一应用程序中进行拖放,也可以通过标准的OLE拖放机制来处理拖放。从OLE的角度来看,它处理两个应用程序,源程序和目标程序,并将它们适当地解耦。由于OLE的存在时间远长于.NET,因此OLE没有.NET异常的概念,因此无法将异常从目标通信回源。即使可以,源代码为什么要关心目标无法执行删除? 如果要在DragDrop事件期间处理异常,则必须在DragDrop事件处理程序中处理该异常,该异常不会传播到该事件处理程序之外,因为源和目标之间存在托管到非托管到托管的代码转换。
请参阅问题后的第一个答案。

您可能希望共享此问题的一些代码。我已经创建了两个处理程序,但其中任何一个都没有显示异常。在visual studio中,点击调试->异常,并勾选“公共语言运行时异常”旁边的“抛出”框。这将使调试器在抛出异常时立即进入您的代码,并且您可以使用F10/F11沿着它所遵循的路径行走。