[c#] 404를 어떻게 잡을 수 있습니까?

다음 코드가 있습니다.

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

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

특정 404 오류를 어떻게 잡을 수 있습니까? WebExceptionStatus.ProtocolError는 오류가 발생했음을 감지 만 할 수 있지만 오류의 정확한 코드를 제공하지는 않습니다.

예를 들면 :

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

충분히 유용하지 않습니다 … 프로토콜 예외는 401, 503, 403이 될 수 있습니다.



답변

를 사용하여 HttpStatusCode Enumeration특히,HttpStatusCode.NotFound

다음과 같은 것 :

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

어디
we입니다 WebException.


답변

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


답변

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
}


답변

나는 이것을 테스트하지 않았지만 작동합니다.

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


답변

당신이 잡을 경우 생각 WebException이를 가 … 내가 어떤 사람을 아는에 관심이있을 거라고 나는 순간에 알고있는 유일한 방법이다 (404) 인 경우를 판별하는 데 사용할 수있는 거기에 몇 가지 정보가 …

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


답변

이 snipit을 확인하십시오. GetResponse는 WebRequestException을 발생시킵니다. 그것을 포착하면 응답에서 상태 코드를 얻을 수 있습니다.

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);
}

이것은 http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx 에서 왔습니다 .


답변

적절한 예외 유형을 포착하십시오 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");
}