拖放时会吞下异常

时间:2009-06-09 13:11:05

标签: c# winforms exception drag-and-drop

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

在某些时候,我想拒绝基础业务实现中的操作,因此我抛出异常。我可以在“输出”窗口中看到“异常”,但问题是我无法在UI中看到它并且它不会崩溃。

Exception去了哪里?

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

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());

  }

}

2 个答案:

答案 0 :(得分:12)

我在互联网上找到了这个解释:

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

问题后见here第一个答案。

答案 1 :(得分:0)

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

有关详细信息,请参阅here