我怎么能抓到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; } } 

只是没有用…协议exception可能是401,503,403,真的是什么。

使用HttpStatusCode Enumeration ,特别是HttpStatusCode.NotFound

就像是:

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

哪里
weWebException

 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中,您可以使用exceptionfilter 。

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

看看这个片段。 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

请参阅MSDN有关响应状态的信息:

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

对于浏览这个的VB.NET人来说,我相信只有当它真的是404时我们才能捕获exception。例如:

 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 

捕获正确的exception类型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"); } 

当使用WebRequest类将POST或GET数据发送到服务器时,exception的类型将是WebException.Below是文件未找到exception的代码

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