我有一个c#应用程序向几个API发送请求,但今天早些时候,其中一个请求似乎中断了一段时间,并在我的异常处理程序中引发了异常:
catch (WebException e)
{
var statusCode = ((HttpWebResponse)e.Response).StatusCode;
//Use status code and exception for reporting and handling.
}这导致了一个问题,因为在当时,异常没有Response,所以我试图获得nothing的StatusCode,然后抛出一个NullPointerException。
此后,我将其更改为此,以便在没有响应的情况下尝试获取状态代码(无论如何,除了状态代码之外,我没有使用响应)。
catch (WebException e)
{
//Try to get the status code from the exception, can fail somehow.
HttpStatusCode statusCode;
try
{
statusCode = (HttpStatusCode)e.Status;
}
catch(Exception innerE)
{
//Capture exceptions for logging
//...
//Set a default code to continue.
statusCode = HttpStatusCode.InternalServerError;
}
//Use status code and exception for reporting and handling.
}在this answer中,您可以尝试从响应中获得状态,也可以从异常中获得状态。
我的问题是,我是应该同时尝试两者,还是其中一个被设置为另一个?
例如,为了测试我现在使用的代码,我能够手动抛出一个状态和没有响应的WebException。
是否会出现这样的情况:我会得到一个没有异常状态的响应?或者可能存在这样一种情况,即响应的状态代码将更加详细,或者与状态代码直接与异常本身不同?
我正在用一个基本的HttpWebRequest打电话。
更新:
我与之交互的API我无法控制,直到今天发生了故障,我才发现返回时可能没有响应。我将其手动设置为500,以便在catch块中更深入地处理自己的错误,用户不知道我使用的是这个。我只是问一种检索StatusCode的方法是否比另一种方式更好/不同。或者我不应该依赖于一种方法而不是另一种方法,如果我应该同时尝试这两种方法,并且选择哪种方法呢?
发布于 2017-05-19 18:38:30
如果可能的话,我对类似情况的处理将是尽可能多地从远程服务器获取信息。如果没有响应,捕获将手动分配状态代码。
当您开始发回各种代码,特别是5xx系列服务器错误时,问题就出现了。我不喜欢把他们的500美元还给我,因为这是我的问题。
从长远来看,被捕获的网络异常只会被登录到ApiError表中,我会返回我认为最合适的响应代码,回到408,或者如果没有响应,我会将非标准的444代码发回“无响应”。
这就是错误处理的美妙之处;您捕获了一个错误,尽了最大的努力,并且可以转换成一个标准化的HTTP状态。
发布于 2020-07-29 17:48:17
我也有同样的问题,在我寻找解决方案的时候,我意识到了一些事情。
WebExceptionStatus enum不等同于您调用的API返回的http状态代码。相反,它是一个可能的错误的枚举,可能发生在一个http调用。WebExceptionStatus错误代码是WebExceptionStatus.ProtocolError,也就是编号7的int。WebExceptionStatus.Status是否为WebExceptionStatus.ProtocolError。然后,您可以从WebExceptionStatus.Response获得真正的响应并阅读其内容。这就是一个例子:
try
{
...
}
catch (WebException webException)
{
if (webException.Status == WebExceptionStatus.ProtocolError)
{
var httpResponse = (HttpWebResponse)webException.Response;
var responseText = "";
using (var content = new StreamReader(httpResponse.GetResponseStream()))
{
responseText = content.ReadToEnd(); // Get response body as text
}
int statusCode = (int)httpResponse.StatusCode; // Get the status code
}
// Handle other webException.Status errors
}https://stackoverflow.com/questions/44075071
复制相似问题