Итак, у меня есть определенное исключение, защищенные конструкторы, статические методы конструктора (поэтому все исключения генерируются с одинаковым форматированием, и мне не нужно бороться с конструкторами. В любом случае, это не имеет значения). (не моя проблема? давайте оставим это в покое 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()
в сеансе данных.
Таким образом, в основном как обзор :
Save()
вызывается. Flush()
вызывается в NHibernate - конвейер NHibernateвыполняется
- Вызывается мое
PreInsertEventListener
событие. 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#