Mam następujący kod:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Jak mogę złapać określony błąd 404? WebExceptionStatus.ProtocolError może tylko wykryć wystąpienie błędu, ale nie podaje dokładnego kodu błędu.
Na przykład:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
Po prostu nie jest wystarczająco przydatne ... wyjątek protokołu może mieć wartość 401, 503, 403, cokolwiek naprawdę.
System.Exception
i nie polegaj na tekście wyjątku w swoim module obsługi!throw ex
, wygenerujesz nowy wyjątek z pustym stosem wywołań. Po prostu użyjthrow
.WebRequest
Odpowiedzi:
Użyj w
HttpStatusCode Enumeration
szczególnościHttpStatusCode.NotFound
Coś jak:
HttpWebResponse errorResponse = we.Response as HttpWebResponse; if (errorResponse.StatusCode == HttpStatusCode.NotFound) { // }
Gdzie
we
jestWebException
.źródło
we.Response
tak nie jestHttpWebResponse
. Jeśli kod pragnie założyć, że będzie zawsze mają tego typu, to powinien po prostu obsada:HttpWebResponse errorResponse = (HttpWebResponse)we.Response;
. Spowoduje to rzucenie wyraźnego,InvalidCastException
jeśli stanie się niemożliwe, zamiast tajemniczegoNullReferenceException
.An object reference is required for the non-static field, method, or property 'WebException.Response'
tego kodu.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 } }
źródło
throw
( ponowne rzucenie ) na końcu twojegocatch
, w przeciwnym razie po cichu zje każdy inny rodzajWebException
.WebRequest
nie implementujeIDisposable
.W C # 6 możesz używać filtrów wyjątków .
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 }
źródło
Nie testowałem tego, ale powinno działać
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; }
źródło
catch
blok, ponieważ miałem dokładnie ten sam kod w próbie co OP. Naprawdę powinieneś całkowicie zlekceważyć to pytanie z powodu kodu OP.Myślę, że jeśli złapiesz WebException , jest tam kilka informacji, których możesz użyć do ustalenia, czy to 404. To jedyny sposób, jaki znam w tej chwili ... Chciałbym poznać inne ...
catch(WebException e) { if(e.Status == WebExceptionStatus.ProtocolError) { var statusCode = (HttpWebResponse)e.Response).StatusCode); var description = (HttpWebResponse)e.Response).StatusDescription); } }
źródło
Sprawdź ten fragment. GetResponse zgłosi wyjątek WebRequestException. Złap to i możesz uzyskać kod stanu z odpowiedzi.
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); }
pochodzi z http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx
źródło
Złap odpowiedni typ wyjątku
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"); }
źródło
e.Response
jakHttpWebResponse
przed uzyskaniem dostępu doStatusCode
.Zobacz w MSDN o stanie odpowiedzi:
... catch(WebException e) { Console.WriteLine("The following error occured : {0}",e.Status); } ...
źródło
Dla osób przeglądających to VB.NET uważam, że możemy złapać wyjątek tylko wtedy, gdy naprawdę jest to 404. Coś takiego:
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
źródło
gdy POST lub GET dane do serwera przy użyciu klasy WebRequest, typ wyjątku będzie WebException. poniżej znajduje się kod dla wyjątku nie znaleziono pliku
//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); } }
źródło