首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用哪个WebException状态代码?

使用哪个WebException状态代码?
EN

Stack Overflow用户
提问于 2017-05-19 16:41:04
回答 2查看 3.3K关注 0票数 0

我有一个c#应用程序向几个API发送请求,但今天早些时候,其中一个请求似乎中断了一段时间,并在我的异常处理程序中引发了异常:

代码语言:javascript
复制
catch (WebException e)
{
    var statusCode = ((HttpWebResponse)e.Response).StatusCode;
    //Use status code and exception for reporting and handling.
}

这导致了一个问题,因为在当时,异常没有Response,所以我试图获得nothing的StatusCode,然后抛出一个NullPointerException。

此后,我将其更改为此,以便在没有响应的情况下尝试获取状态代码(无论如何,除了状态代码之外,我没有使用响应)。

代码语言:javascript
复制
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的方法是否比另一种方式更好/不同。或者我不应该依赖于一种方法而不是另一种方法,如果我应该同时尝试这两种方法,并且选择哪种方法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-19 18:38:30

如果可能的话,我对类似情况的处理将是尽可能多地从远程服务器获取信息。如果没有响应,捕获将手动分配状态代码。

当您开始发回各种代码,特别是5xx系列服务器错误时,问题就出现了。我不喜欢把他们的500美元还给我,因为这是我的问题。

从长远来看,被捕获的网络异常只会被登录到ApiError表中,我会返回我认为最合适的响应代码,回到408,或者如果没有响应,我会将非标准的444代码发回“无响应”。

这就是错误处理的美妙之处;您捕获了一个错误,尽了最大的努力,并且可以转换成一个标准化的HTTP状态。

票数 1
EN

Stack Overflow用户

发布于 2020-07-29 17:48:17

我也有同样的问题,在我寻找解决方案的时候,我意识到了一些事情。

  • WebExceptionStatus enum不等同于您调用的API返回的http状态代码。相反,它是一个可能的错误的枚举,可能发生在一个http调用。
  • 当您从API接收到一个错误(400-599)时,将返回的WebExceptionStatus错误代码是WebExceptionStatus.ProtocolError,也就是编号7的int。
  • 当您需要获取从api返回的响应体或真正的http状态代码时,首先需要检查WebExceptionStatus.Status是否为WebExceptionStatus.ProtocolError。然后,您可以从WebExceptionStatus.Response获得真正的响应并阅读其内容。

这就是一个例子:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44075071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档