Не удалось поймать исключение?Visual Studio таинственно зависает - PullRequest
2 голосов
/ 30 июня 2010

Итак, у меня есть определенное исключение, защищенные конструкторы, статические методы конструктора (поэтому все исключения генерируются с одинаковым форматированием, и мне не нужно бороться с конструкторами. В любом случае, это не имеет значения). (не моя проблема? давайте оставим это в покое k?)

public class ValidationException : Exception
{
   // Constructors
   public static ValidationException Create(IEnumerable<string> errors)
   {
      // yadda, yadda, yadda, build exception message, pass in errors, configure, shabang...
      return vex; // vex is the created exception
   }
}

Тогда у меня есть следующий код как часть NHibernate PreInsertEventListener.

IDictionary<string, IEnumerable<string>> validationErrors;
if (TryValidateObject(obj, out validationErrors)) return;

throw ValidationException.Create(validationErrors);

Тогда в моей реализации у меня есть это:

try
{
   Save();
}
catch (ValidationException)
{
   UserMessage.CreateMessage("A Validation error has occured. Please contact your system administrator / software support.").Show();
}

Функция сохранения в основном выполняет все мои последние манипуляции в NHibernate и выполняет Flush() в сеансе данных.

Таким образом, в основном как обзор :

  1. Save() вызывается.
  2. Flush() вызывается в NHibernate
  3. конвейер NHibernateвыполняется
  4. Вызывается мое PreInsertEventListener событие.
  5. ValidationException.Create(...) вызывается, что возвращает ValidationException. Затем оно выбрасывается из PreInsertEventListener

Теперь вот настоящая глупышка. Ожидаемое поведение состоит в том, что блок catch срабатывает и ловитmy ValidationException, отображая диалоговое окно с моим сообщением.

Но на самом деле это то, что vstudio и мое приложение в режиме отладки зависают примерно на 1 минуту.100% не отвечает, оконные сигналы игнорируются, окна готовы запустить процесс в задницу, затем он, наконец, отклеивается и сообщает мне «Необработанное исключение ValidationException», точно в той же строке, что я выкидываю мое исключение.Так что почему-то это не ловится.

Когда я запускаю это вне отладчика, приложение insta-fails.

Я что-то упустил?Это все должно выполняться из одного потока, стек вызовов довольно прост:

> MyApp.Core.dll!MyApp.Core.Validation.ValidationHelper.DoValidateObject(object obj = {MyApp.Data.Entities.Administration.Career}) Line 153 C#
  MyApp.Data.Entities.dll!MyApp.Data.Entities.Entity.Validate(out System.Collections.Generic.IDictionary> validationErrors = null, bool throwExceptions = true) Line 73 + 0xa bytes C#
  MyApp.Data.dll!MyApp.Data.NHibernate.EntityValidateListener.OnPreInsert(NHibernate.Event.PreInsertEvent event = {NHibernate.Event.PreInsertEvent}) Line 23 + 0x30 bytes C#
  NHibernate.dll!NHibernate.Action.EntityInsertAction.PreInsert() Line 151 + 0x42 bytes C#
  NHibernate.dll!NHibernate.Action.EntityInsertAction.Execute() Line 44 + 0xd bytes C#
  NHibernate.dll!NHibernate.Engine.ActionQueue.Execute(NHibernate.Action.IExecutable executable = {EntityInsertAction[MyApp.Data.Entities.Administration.Career#24cda829-e829-4228-997f-55ff890d6eec]}) Line 130 + 0x37 bytes C#
  NHibernate.dll!NHibernate.Engine.ActionQueue.ExecuteActions(System.Collections.IList list = Count = 1) Line 113 + 0x10 bytes C#
  NHibernate.dll!NHibernate.Engine.ActionQueue.ExecuteActions() Line 146 + 0x13 bytes C#
  NHibernate.dll!NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(NHibernate.Event.IEventSource session = {NHibernate.Impl.SessionImpl}) Line 240 + 0x3d bytes C#
  NHibernate.dll!NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(NHibernate.Event.FlushEvent event = {NHibernate.Event.FlushEvent}) Line 19 + 0x1b bytes C#
  NHibernate.dll!NHibernate.Impl.SessionImpl.Flush() Line 1187 + 0x92 bytes C#
  MyApp.Data.dll!MyApp.Data.AbstractDataSession.Flush() Line 57 + 0x36 bytes C#
  MyApp.UIFramework.dll!MyApp.UIFramework.ViewModel.EntitiesViewModel.Save() Line 110 + 0x2c bytes C#
  ManagerWPF.exe!ManagerWPF.Modules.Careers.ViewModels.CareersViewModel.HandleSave() Line 274 + 0x11 bytes C#
  ManagerWPF.exe!ManagerWPF.Modules.Careers.ViewModels.CareersViewModel.get_SaveCommand.AnonymousMethod(object x = null) Line 263 + 0xa bytes C#
  MyApp.UIFramework.dll!MyApp.UIFramework.Commands.DelegateCommand.Execute(object parameter = null) Line 50 + 0x24 bytes C#

1 Ответ

3 голосов
/ 30 июня 2010

Если вы уверены, что все происходит в одном потоке (именно так это выглядит в вашем стеке вызовов), то это также может быть конфликт пространства имен.

Являются ли типы ValidationException выбрасываемыми и те, которые должны быть перехвачены, идентичны, т.е. в одном и том же пространстве имен? Кажется, что NHibernate уже определяет ValidationException, и вы также определяете свой собственный ValidationException.

Чтобы решить такую ​​проблему, у вас есть несколько вариантов:

  • Избавьтесь от своего собственного пользовательского исключения и используйте тот, который предоставляется фреймворком
  • Переименуйте свой класс исключений
  • Используйте полные имена, например, MyApp.Exceptions.ValidationException
  • Использовать псевдоним при импорте пространства имен: using MyEx = MyApp.Exceptions;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...