2014-03-24 66 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. 被抓