我有一个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());
}
}
答案 0 :(得分:12)
我在互联网上找到了这个解释:
即使在同一应用程序中进行拖放操作,也可以通过标准的OLE拖放机制处理拖放操作。从OLE的角度来看,它处理两个应用程序,源和目标,并适当地解耦它们。由于OLE远远超过.NET,因此OLE没有.NET异常的概念,因此无法将目标中的异常传递回源。即使它可以,为什么来源关心目标无法执行下降? 如果要在DragDrop事件期间处理异常,则必须在DragDrop事件处理程序中处理它,它不会传播到该事件处理程序之外,因为源和目标之间存在托管到非托管到托管代码的过渡。
问题后见here第一个答案。
答案 1 :(得分:0)
异常可能发生在某个地方的后台线程上。您需要为AppDomain.CurrentDomain.UnhandledException或Application.ThreadException事件创建一个处理程序。
有关详细信息,请参阅here。