2014-02-11 54 views
1

我在我的系統中進行外部API調用。如果用戶未登錄,代碼將生成404錯誤。我想識別我的代碼中的錯誤。可能嗎? 錯誤這個樣子的 enter image description here如何檢查C#中的錯誤類型

我的代碼是這樣的

public string ExecuteGetRequest() 
    { 
     try 
     { 
      _url = Qparams != null ? Utility.WEBAPI_ENDPOINT + Type + "?" + Qparams : Utility.WEBAPI_ENDPOINT + Type; ; 
      var httpWebRequest = (HttpWebRequest)WebRequest.Create(_url); 

      if (!string.IsNullOrEmpty(SessionValues.UserID)&& !string.IsNullOrEmpty(SessionValues.AccessToken)) 
      { 
       var handler = new HttpClientHandler(); 
       handler.Credentials = new NetworkCredential(SessionValues.UserID, SessionValues.AccessToken); 
       string authInfo = SessionValues.UserID + ":" + SessionValues.AccessToken; 
       authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
       string username = SessionValues.UserID; 
       String password = SessionValues.AccessToken; 
       String encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(username + ":" + password)); 
       httpWebRequest.Headers.Add("Authorization", "Basic " + encoded); 


      } 
      httpWebRequest.Method = "GET"; 
      var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

      using (var streamReader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8)) 
      { 
       _result = streamReader.ReadToEnd(); 
      } 


     } 
     catch (Exception ex) 
     { 
      Log.Add(LogTypes.Error,100, ex.ToString()); 

     } 

     return _result; 

    } 

回答

2

將異常轉換爲其實際類型以訪問WebResponse對象。然後,將該響應對象轉換爲HttpWebResponse以獲取錯誤代碼(以及可選的響應內容)。

try 
{ 
    // ... 
} 
catch (WebException ex) 
{ 
    var response = (HttpWebResponse) ex.Response; 

    var errorCode = response.StatusCode; 

    Log.Add(LogTypes.Error, errorCode, ex.Message); 
} 
1

您可以選擇每行同時調試並右鍵單擊該,然後單擊添加監視選項那裏,這個你可以找出哪些線正在產生錯誤。

1

如果你看一下截圖你貼,你可以看到實際的異常類是System.Net.WebExceptionWebException有很多有用的屬性,包括WebResponse。您可以將該響應轉換爲HttpWebResponse,然後查詢其狀態代碼。你可以做的是爲WebExceptions添加一個專門的異常處理程序。

try 
{ 
    // do your stuff 
} 
catch (WebException webEx) 
{ 
    var response = webEx.Response as HttpWebResponse; 

    if (response != null) 
    { 
     Log.Add(LogTypes.Error, 100, "HTTP StatusCode = " + (int)response.StatusCode); 
    } 
} 
catch (Exception ex) 
{ 
    Log.Add(LogTypes.Error, 100, ex.ToString()); 
} 
1

首先對大家平時應該只捕獲特定類型的異常,而不是捕獲所有喜歡你在這裏做,所以我將有你的catch塊爲:

catch (WebException ex) 
{ 
    if (e.Status == WebExceptionStatus.ProtocolError) 
    { 
     Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode); 
     Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription); 
    } 
} 

顯然不是寫入的控制檯,你可以做任何你想要的狀態碼和描述。

1

您可以探索所有的內部異常的

catch(Exception ex) 
{ 
    string errorMessage = string.Empty; 
    while (ex.InnerException != null) 
    { 
     errorMessage += ex.Message + Environment.NewLine; 
     ex = ex.InnerException; 
    } 
    errorMessage += ex.Message + Environment.NewLine; 
    MessageBox.Show(errorMessage); 
}