没有抛出ApplicationException来正确捕获块

时间:2014-03-24 19:00:09

标签: c# exception linq-to-sql

我遇到了覆盖LINQ to SQL类的OnValidate方法的问题。我已经正确地编写了我的业务规则并且一切都很好,但是当我在调用我的存储库时捕获异常时,应用程序将异常视为未处理。

在LINQ to SQL分部类中,我有以下内容:

    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 to SQL类属性的一组检查。

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

以下是Button周围的代码:( 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()方法中捕获并重新抛出异常,但它仍然失败并将throw行指向我的OnValidate方法。

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

1 个答案:

答案 0 :(得分:1)

感谢Reed Copsey和Astander的评论,我明白了。我的调试器设置为在ApplicationExceptionSystem.Exception的用户未处理的例外中断。

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

关闭Break on Exception功能允许Exception冒泡到我想要的位置。

对于Brevity,这里是执行此操作的步骤:

  1. 转到VS
  2. 中的“调试”菜单
  3. 点击'例外...'
  4. 展开“公共语言运行时(CLR)例外”
  5. 取消选中不要想要被First Chance调试器捕获的异常类型
  6. 点击确定