2012-11-29 53 views
0

如果用戶等待5分鐘,我的表格顯示,當他們點擊「有效」按鈕用try和catch關鍵字自定義異常C#的

服務器無法處理請求下面的消息。 --->原始錯誤消息:數據庫問題,但提取實體失敗。 ---> [IBM U2] [UODOTNET - UNICLIENT] [錯誤碼= 45002]無法在一個空的recordId

所以我想用try和catch關鍵字進行操作,

,但我有一個錯誤mesage白衣此代碼:

try 
      { 

       SetPageState(); 
       Session["NewStep"] = "NewStepConfirm"; 
       Response.Redirect(stepone.aspx"); 
      } 
      catch (Exception ex) 
      { 
       if (ex.ErrorCode == 45002) 
       { 
        ErrorLabel.Text = "We are very sorry but don't wait for long time"; 
       } 
       else 
       { 
        ErrorLabel.Text = ex.Message; 
       } 
       ErrorLabel.Visible = true; 
      } 

這裏是一個消息錯誤

編譯器錯誤消息:CS1061:「System.Exception的」不包含關於「錯誤碼」和沒有擴展方法「錯誤碼」接受的定義的第一個類型 'System.Exception的' 的rgument可以找到(是否缺少using指令或程序集引用?)

源錯誤:

if (ex.ErrorCode == 45002) 

如何,我可以使用try和catch關鍵字

謝謝

+0

實際拋出哪種類型的異常?捕獲異常,而不是捕獲異常。在你的catch線後面放一個斷點,將鼠標懸停在ex上,看看它是什麼類型的異常。然後更改您的代碼以捕獲該異常並訪問其屬性。 –

回答

1

您需要捕獲正在拋出的特定類型的異常。

捕獲基本異常類被認爲是不好的做法(或者至少是最後的努力)。如果您捕獲了特定的異常類型,則可以訪問要查找的屬性。

try 
{ 
    DoSomethingThatThrowsACustomWidgetException() ; 
} 
catch (CustomWidgetException e) 
{ 
    int errorCode = e.ErrorCode ; 
    ... 
} 

如果趕上基Exception類,你需要垂頭喪氣就其類型:

try 
{ 
    DoSomethingThatThrowsACustomWidgetException() ; 
} 
catch (Exception e) 
{ 
    CustomWidgetException cwe = e as CustomWidgetException ; 

    if (cwe == null) throw ; 

    int errorCode = cwe.ErrorCode ; 
    ... 

} 

輕鬆!

1

刪除ErrorCode的測試,在catch塊中設置斷點,在調試器中運行您的應用程序並重現失敗。

當調試器停在斷點處時,檢查異常對象。它是什麼類型?它有什麼領域?這個異常對象有可能是你之後的ErrorCode。如果是這樣,你就完成了。編輯你的catch子句來捕獲特定的異常類型。

但是,錯誤消息的結構(「 - >」和「原始消息」)向我暗示,這可能是一個包裝的異常 - 異常由核心代碼引發的中間代碼捕獲,拋出異常B.希望B將在InnerException屬性中保留對原始異常A的引用。檢查你的異常對象的InnerException屬性和該對象的InnerException屬性等等,以跟隨鏈查找原始異常,因爲這是最有可能擁有你後面的數據的。

您在文本中看到的錯誤代碼可能不是任何異常對象的正式屬性,它可能只是嵌入在字符串中的數據。

如果您之後的數據被埋在InnerException中,那麼您無法捕捉到該數據。你必須捕捉最外層異常的類型(當調試器停在你的斷點處時,ex變量的類型),然後在InnerException鏈中挖掘以提取你之後的數據。