我正在系统中进行外部API调用。如果用户未登录代码将生成404错误。我想在我的代码中识别出错误。可能吗?
错误看起来像这样
我的代码就像这样
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;
}
答案 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.WebException。 WebException
有很多有用的属性,包括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);
}