У меня такой код:
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, действительно что угодно.
System.Exception
и не зависите от текста исключения в вашем обработчике!throw ex
, вы создадите новое исключение с пустым стеком вызовов. Просто используйтеthrow
.WebRequest
Ответы:
Используйте
HttpStatusCode Enumeration
, в частностиHttpStatusCode.NotFound
Что-то типа:
HttpWebResponse errorResponse = we.Response as HttpWebResponse; if (errorResponse.StatusCode == HttpStatusCode.NotFound) { // }
Где
we
находитсяWebException
.источник
we.Response
это не такHttpWebResponse
. Если код желает предположить , что она всегда будет иметь этот тип, то он должен просто бросить:HttpWebResponse errorResponse = (HttpWebResponse)we.Response;
. Это вызовет явное,InvalidCastException
если произойдет невозможное, вместо загадочногоNullReferenceException
.An object reference is required for the non-static field, method, or property 'WebException.Response'
использую этот код.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 } }
источник
throw
в конце вашего должен быть (переброс)catch
, иначе он просто незаметно съест любой другой типWebException
.WebRequest
не реализуетIDisposable
.В 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; }
источник
catch
блок, поскольку у меня был тот же код в попытке, что и OP. Тогда вы действительно должны вообще отказаться от этого вопроса из-за кода OP.Я думаю, что если вы поймаете 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
источник
Поймать правильный тип исключения
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"); }
источник
e.Response
какHttpWebResponse
до получения доступа кStatusCode
.См. Информацию о статусе ответа в MSDN :
... catch(WebException e) { Console.WriteLine("The following error occured : {0}",e.Status); } ...
источник
Я считаю, что для людей VB.NET, просматривающих это, мы можем поймать исключение только в том случае, если это действительно 404. Что-то вроде:
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
источник
при отправке данных POST или GET на сервер с использованием класса WebRequest тип исключения будет WebException. Ниже приведен код исключения файла, который не найден.
//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); } }
источник