我怎么能抓到404?

JL.*_*JL. 87 .net c# error-handling exception-handling http-status-code-404

我有以下代码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;

try
{
    request.GetResponse();
}
catch
{
}
Run Code Online (Sandbox Code Playgroud)

如何捕获特定的404错误?WebExceptionStatus.ProtocolError只能检测到发生了错误,但未提供错误的确切代码.

例如:

catch (WebException ex)
{
    if (ex.Status != WebExceptionStatus.ProtocolError)
    {
        throw ex;
    }
}
Run Code Online (Sandbox Code Playgroud)

只是没用得多......协议异常可能是401,503,403,真的是什么.

Joh*_*ers 123

try
{
    var request = WebRequest.Create(uri);
    using (var response = request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            // Process the stream
        }
    }
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError &&
        ex.Response != null)
    {
        var resp = (HttpWebResponse) ex.Response;
        if (resp.StatusCode == HttpStatusCode.NotFound)
        {
            // Do something
        }
        else
        {
            // Do something else
        }
    }
    else
    {
        // Do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 大声笑@是IDisposable警察,并给每个人一个-1,因为没有将响应包装在一个使用区块中. (10认同)
  • 我实际上是在投票,但我只注意到一件事:在你的`catch`的末尾应该有一个`throw`(rethrow),否则这只会默默地吃掉任何其他类型的`WebException`. (3认同)
  • 这是一项艰巨的工作,但是_someone_必须这样做.OTOH,我几乎没有添加这个答案,因为看起来我正在叮叮当其他所有人让我的答案最受欢迎. (2认同)

Jay*_*ggs 107

使用HttpStatusCode Enumeration,特别是HttpStatusCode.NotFound

就像是:

HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
  //
}
Run Code Online (Sandbox Code Playgroud)

哪里
weWebException.

  • -1我的古代downvote的部分解释:如果由于某种原因,`we.Response`不是`HttpWebResponse`,代码抛出NullReferenceException.如果代码希望假设它将始终具有该类型,那么它应该简单地转换:`HttpWebResponse errorResponse =(HttpWebResponse)we.Response;`.如果不可能发生,这将抛出一个显式的`InvalidCastException`,而不是一个神秘的`NullReferenceException`. (7认同)
  • @BerggreenDK你应该能够只做int httpresonsecode =**(int)**HttpStatusCode.NotFound (2认同)

cra*_*mes 20

在C#6中,您可以使用异常过滤器.

try
{
    var request = WebRequest.Create(uri);
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        // Process the stream
    }
}
catch(WebException ex) when ((ex.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound)
{
    // handle 404 exceptions
}
catch (WebException ex)
{
    // handle other web exceptions
}
Run Code Online (Sandbox Code Playgroud)


Mif*_*Fox 13

我没有测试过这个,但它应该可以工作

try
{
    // TODO: Make request.
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError) {
        HttpWebResponse resp = ex.Response as HttpWebResponse;
        if (resp != null && resp.StatusCode == HttpStatusCode.NotFound)
        {
            // TODO: Handle 404 error.
        }
        else
            throw;
    }
    else
        throw;
}
Run Code Online (Sandbox Code Playgroud)