wake-up-neo.com

Wie kann ich einen 404 fangen?

Ich habe folgenden Code:

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

try
{
    request.GetResponse();
}
catch
{
}

Wie kann ich einen bestimmten 404-Fehler abfangen? Der WebExceptionStatus.ProtocolError kann nur erkennen, dass ein Fehler aufgetreten ist, gibt jedoch nicht den genauen Code des Fehlers an.

Beispielsweise:

catch (WebException ex)
{
    if (ex.Status != WebExceptionStatus.ProtocolError)
    {
        throw ex;
    }
}

Ist einfach nicht sinnvoll genug ... die Protokollausnahme könnte 401, 503, 403 sein, eigentlich alles.

85
JL.

Verwenden Sie die HttpStatusCode Enumeration, speziell HttpStatusCode.NotFound

So etwas wie:

HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
  //
}

Woher
we ist ein WebException.

105
Jay Riggs
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
    }
}
122
John Saunders

In C # 6 können Sie Ausnahmefilter verwenden.

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
}
19
craftworkgames

Ich habe das noch nicht getestet, aber es sollte funktionieren

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;
}
13
MiffTheFox

Ich denke, wenn Sie eine WebException abfangen, gibt es einige Informationen, anhand derer Sie feststellen können, ob es sich um eine 404 handelt. Das ist der einzige Weg, den ich im Moment kenne ... Ich wäre interessiert andere zu kennen ...

catch(WebException e) {
    if(e.Status == WebExceptionStatus.ProtocolError) {
        var statusCode = (HttpWebResponse)e.Response).StatusCode);
        var description = (HttpWebResponse)e.Response).StatusDescription);
    }
}
4
mezoid

Für VB.NET-Benutzer, die hier surfen, können wir die Ausnahme meines Erachtens nur dann abfangen, wenn es sich tatsächlich um einen 404 handelt.

Try
    httpWebrequest.GetResponse()
Catch we As WebException When we.Response IsNot Nothing _
                              AndAlso TypeOf we.Response Is HttpWebResponse _
                              AndAlso (DirectCast(we.Response, HttpWebResponse).StatusCode = HttpStatusCode.NotFound)

    ' ...

End Try
2
unnknown

Siehe unter MSDN zum Status der Antwort:

...
catch(WebException e) {
  Console.WriteLine("The following error occured : {0}",e.Status);  
}
...
2
Dror

Fangen Sie den richtigen Ausnahmetyp ab WebException :

try
{
    var request = (HttpWebRequest) WebRequest.Create(String.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe));

    using(var response = (HttpWebResponse)request.GetResponse())
        Response.Write("has avatar");
}
catch(WebException e) 
{
  if(e.Response.StatusCode == 404) 
    Response.Write("No avatar");
}
2
Nick Craver

Schauen Sie sich diesen Ausschnitt an. Die GetResponse löst eine WebRequestException aus. Fangen Sie das ein und Sie können den Statuscode aus der Antwort abrufen.

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

dies kam von http://msdn.Microsoft.com/en-us/library/system.net.webexception.status.aspx

2
Jonathan S.

Wenn POST oder GET data to the server using WebRequest class, dann wäre der Typ der Ausnahme WebException.Below ist der Code für die Datei nicht gefunden Ausnahme

        //Create a web request with the specified URL
            string path = @"http://localhost/test.xml1";
            WebRequest myWebRequest = WebRequest.Create(path);

       //Senda a web request and wait for response.
                try
                {
                    WebResponse objwebResponse = myWebRequest.GetResponse();
                    Stream stream= objwebResponse.GetResponseStream();

                }
                catch (WebException ex) {
                    if (((HttpWebResponse)(ex.Response)).StatusCode == HttpStatusCode.NotFound) {
                        throw new FileNotFoundException(ex.Message);
                    }

                }
1