2012-02-14 86 views
39

我有一塊的嘗試捕捉代碼:如何確定是否異常是一種特殊類型

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    ModelState.AddModelError(
     "duplicateInvoiceNumberOrganisation", "The combination of organisation and invoice number must be unique"); 
} 

對於這段代碼我試圖插入一條記錄到數據庫:DBA必須設置它以便數據庫檢查重複項,並在重複時返回錯誤。目前,正如您所看到的,無論發生什麼錯誤,我都會向模型添加相同的錯誤。我想改變它,所以如果這個錯誤是由dba設置的重複錯誤引起的,那麼這個錯誤只會被添加到模型中。

下面是我想要捕捉的錯誤。注意它在內部例外。誰能告訴我如何具體抓住這一個?

enter image description here

+0

見達維德的答案。通常捕捉「例外」不是最佳實踐。你應該儘可能具體,讓任何你無法處理的東西冒泡到用戶/框架。 – Ryan 2012-02-14 00:21:22

+1

看看這個答案: http://stackoverflow.com/questions/3967140/c-sharp-entity-framework-duplicate-unique-exception – 2012-02-14 00:21:41

回答

75

之前,當前的捕撈添加以下內容:

catch(DbUpdateException ex) 
{ 
    if(ex.InnerException is UpdateException) 
    { 
    // do what you want with ex.InnerException... 
    } 
} 
-1

你可以看看SQLException類 - 和檢查異常的消息的內容,如果它包含了什麼你現在看到你內心的exception..Something這樣的:

try 
{ 
    //your code here 
} 
catch (SQLException ex) 
{ 
    if (ex.Message.Contains("Cannot insert duplicate key in obj....")) 
    { 
     //your code here 
    } 
} 
+1

我懷疑SQLEXCEPTION直接拋出,但只作爲內部異常。此外,檢查錯誤編號而不是與消息文本進行比較可能會更好。 – 2012-02-14 00:44:20

+0

是的,你也可以檢查錯誤號碼。感謝您的評論。 – 2012-02-14 00:46:01

+0

如何檢查錯誤編號?我甚至不確定它是什麼數字,因爲它是一個真正的特定錯誤? – AnonyMouse 2012-02-14 00:56:42

8

替換System.Threading.ThreadAbortException用你的例外。

try 
{ 
    //assume ThreadAbortException occurs here 
} 
catch (Exception ex) 
{ 
    if (ex.GetType().IsAssignableFrom(typeof(System.Threading.ThreadAbortException))) 
    { 
     //what you want to do when ThreadAbortException occurs   
    } 
    else 
    { 
     //do when other exceptions occur 
    } 
} 
0

做喲意味着

catch (Exception e){ 
    if (e.GetType() == XyzException) 
    //if (e.GetType().ToString() == "XyzException") 
    //if (e.GetType().Name == .....) 
} 
0

爲了得到異常的名稱,你可以使用

catch (Exception exc){ 
     if (exc.GetType().FullName == "Your_Exception") 
     { 
      // The same can be user for InnerExceptions 
      // exc.InnerException.GetType().FullName 
     } 
    } 
相關問題