如何在C#中检查错误类型

时间:2014-02-11 12:36:03

标签: c# asp.net error-handling

我正在系统中进行外部API调用。如果用户未登录代码将生成404错误。我想在我的代码中识别出错误。可能吗? 错误看起来像这样 enter image description here

我的代码就像这样

    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;

    }

5 个答案:

答案 0 :(得分: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)

您可以在调试时选择每一行并右键单击该行,然后单击“添加监视”选项,通过此选项可以确定哪一行产生错误。

答案 2 :(得分: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());
}

答案 3 :(得分: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);
     } 
}

显然,不是写入控制台,而是使用StatusCode和Description来做任何你想做的事。

答案 4 :(得分: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);
}