我遇到了覆盖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周围的代码:( Repository
是IRepository
的注入实现。
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
块?
答案 0 :(得分:1)
感谢Reed Copsey和Astander的评论,我明白了。我的调试器设置为在ApplicationException
和System.Exception
的用户未处理的例外中断。
我之前没有抓到这个的原因是因为我认为以某种方式在catch块中“处理”它们会覆盖第一次机会功能,但显然事实并非如此。
关闭Break on Exception功能允许Exception冒泡到我想要的位置。
对于Brevity,这里是执行此操作的步骤: