异常捕获失败? Visual Studio神秘地挂起

时间:2010-06-30 16:21:41

标签: c# .net wpf visual-studio exception

所以我已经定义了这个异常,受保护的构造函数,静态构造函数方法(所以所有异常都是用相同的格式生成的,我不需要在构造函数中进行操作。无论如何,这是除了点之外.. (不是我的问题?让我们独自留下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();
}

save函数基本上完成了NHibernate中的所有最终操作,并在数据会话上执行Flush()

基本上是概述

  1. Save()被召唤。
  2. Flush() NHibernate
  3. 中调用
  4. 执行NHibernate的管道
  5. 我的PreInsertEventListener事件被调用。
  6. 调用
  7. ValidationException.Create(...),返回ValidationException。然后从PreInsertEventListener
  8. 抛出此内容

    现在这是真正的蠢事。预期的行为是catch块触发,并捕获我的ValidationException,提示我的用户消息对话框显示。

    但实际发生的事情是vstudio&amp;我在调试中的应用程序挂了大约1分钟。 100%没有反应,窗口信号被忽略,窗口准备好踢屁股的过程,然后它最终解开并告诉我“未处理的ValidationException被抛出”,在我抛出异常的确切行。所以这不会被抓住。

    当我在调试器外运行时,app insta-failed。

    我错过了什么吗?这一切都应该从同一个线程执行,调用堆栈非常清楚:

    > 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 个答案:

答案 0 :(得分:3)

如果你确定所有事情都发生在同一个线程上(这就是你的调用堆栈的样子),那么它也可能是命名空间冲突。

是否抛出ValidationException类型和应该捕获的类型,即在同一名称空间中?似乎NHibernate已经定义了ValidationException,您还定义了自己的ValidationException

要解决此类问题,您有以下几种选择:

  • 摆脱自己的自定义异常并使用框架提供的异常
  • 重命名您的例外类
  • 使用完全限定名称,例如MyApp.Exceptions.ValidationException
  • 导入命名空间时使用别名:using MyEx = MyApp.Exceptions;