Исключение проглатывается при перетаскивании - PullRequest
7 голосов
/ 09 июня 2009

У меня есть приложение WinForms, где я делаю перетаскивание между двумя TreeViews.

В какой-то момент я хочу отклонить действие в базовой бизнес-реализации, поэтому я выбрасываю исключение. Я вижу исключение в окне «Вывод», но проблема в том, что я не вижу его в пользовательском интерфейсе, и он не вылетает.

Куда делось исключение?

Вот код, описывающий проблему:

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 ]

12 голосов
/ 14 октября 2009

Я нашел это объяснение в интернете:

Даже с помощью перетаскивания в одном приложении перетаскивание осуществляется с помощью стандартного механизма перетаскивания OLE. С точки зрения OLE, он имеет дело с двумя приложениями, источником и целью, и соответствующим образом разделяет их. Поскольку OLE существует намного дольше, чем .NET, OLE не имеет понятия исключения .NET и поэтому не может передать исключение из цели обратно в источник. Даже если это возможно, почему источник должен заботиться о том, что цель не может выполнить падение? Если вы хотите обработать исключение во время события DragDrop, вы должны обработать его в своем обработчике события DragDrop, оно не будет распространяться за пределы этого обработчика события, поскольку между исходным и целевым объектами существует переход от управляемого к неуправляемому к управляемому коду.

См. здесь 1-й ответ после вопроса.

0 голосов
/ 09 июня 2009

Исключение, вероятно, происходит где-то в фоновом потоке. вам нужно создать обработчик для AppDomain.CurrentDomain.UnhandledException или события Application.ThreadException.

Подробнее см. здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...