2014-03-24 37 views
1

我有一个问题,我重写了LINQ to SQL类的OnValidate方法。我已经正确编写了我的业务规则,并且一切正常,但是当我去调用我的存储库中的异常时,应用程序将Exception视为未处理。ApplicationException不会被正确地捕获块

在LINQ到SQL局部I类有以下几点:

partial void OnValidate(ChangeAction action) 
    { 
     if (!IsValid) 
      //Application is halting here before my catch block code is reached 
      throw new ApplicationException("Invalid note data recieved! Correct the following issues and try again:"); 
     //UpdateTimeStamp(); 
    } 

IsValid是只是对LINQ一组检查,以SQL类属性。

在我的表单中,我有一个按钮单击事件,它调用我的存储库类中的SubmitChanges方法。我已将它包装在try/catch块中,但该例外不会冒泡到我的catch,而是出现在我的部分类中的throw new ApplicationException()块中的错误。

下面是按钮周围的代码:(RepositoryIRepository的注入实现)。

private void SubmitButton_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      if (IsNewNote) 
      { 
       //CurrentNote is an instance of my LINQ to SQL class. 
       this.Repository.InsertNote(CurrentNote); 
      } 
      this.Repository.Save(); 
     } 
     catch (ApplicationException ex) 
     { 
      MessageBox.Show(String.Format("{0}" + Environment.NewLine + "{1}", ex.Message, this.CurrentNote.GetRuleViolations().FirstOrDefault().ErrorMessage)); 
     } 
    } 

而对于这里的上下文是InsertNote()Save()方法在我的仓库实现(没有什么特别的,只是基本的LINQ to SQL调用)。

public void InsertNote(UnvoucheredInventoryNote note) 
    { 
     _db.UnvoucheredInventoryNotes.InsertOnSubmit(note); 
    } 

    public void Save() 
    { 
     _db.SubmitChanges(); 
    } 

我试图赶上并重新抛出异常的Save()方法,但它仍然失败,并指出在我OnValidate方法throw线。

什么会导致此异常暂停在该行,而不是冒泡到表示层中的我的catch块?

+2

你有看看[如何:断开用户未处理的例外](http://msdn.microsoft.com/en-us/library/038tzxdw.aspx) –

+0

@astander我在下面回答了我的问题在你的和里德的评论指出我在正确的方向。谢谢!芦苇?您的评论完全有效......不知道你为什么删除它。如果你们中的任何一方都愿意以答案的形式发布建议,我会接受而不是我自己的。 –

回答

1

感谢Reed Copsey和Astander的评论,我找到了答案。我的调试器设置为在用户未处理的例外情况下中断ApplicationExceptionSystem.Exception

我之前没有看到这个的原因是因为我认为用某种方式在catch块中“处理”它们会覆盖第一次机会功能,但显然情况并非如此。

关闭异常中止功能允许异常冒泡到我想要的位置。

为了简洁这里进行这样做的步骤:

  1. 进入Debug菜单VS
  2. 点击“例外......”
  3. 展开“通用语言运行时(CLR)例外
  4. 取消选中你DO异常的类型不希望通过第一次有机会调试
  5. 单击确定
  6. 被抓