Eu tenho o seguinte código:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;
try
{
request.GetResponse();
}
catch
{
}
Como posso detectar um erro 404 específico? O WebExceptionStatus.ProtocolError só pode detectar a ocorrência de um erro, mas não fornece o código exato do erro.
Por exemplo:
catch (WebException ex)
{
if (ex.Status != WebExceptionStatus.ProtocolError)
{
throw ex;
}
}
Simplesmente não é útil o suficiente ... a exceção de protocolo pode ser 401, 503, 403, qualquer coisa na verdade.
System.Exception
e não dependa do texto de exceção em seu manipulador!throw ex
, você gerará uma nova exceção com uma pilha de chamadas vazia. Basta usarthrow
.WebRequest
Respostas:
Use o
HttpStatusCode Enumeration
, especificamenteHttpStatusCode.NotFound
Algo como:
Onde
we
está umWebException
.fonte
we.Response
não forHttpWebResponse
. Se o código deseja assumir que terá sempre desse tipo, então ele deve simplesmente lançar:HttpWebResponse errorResponse = (HttpWebResponse)we.Response;
. Isso vai lançar um explícitoInvalidCastException
se o impossível acontecer, em vez de um misteriosoNullReferenceException
.An object reference is required for the non-static field, method, or property 'WebException.Response'
usar este código.fonte
throw
(relançar) no final do seucatch
, caso contrário, ele irá comer qualquer outro tipo deWebException
.WebRequest
não implementaIDisposable
.Em C # 6, você pode usar filtros de exceção .
fonte
Eu não testei isso, mas deve funcionar
fonte
catch
bloco, visto que eu tinha exatamente o mesmo código na tentativa que o OP. Você realmente deveria estar minimizando esta questão por causa do código do OP então.Acho que se você pegar uma WebException, há algumas informações lá que você pode usar para determinar se foi um 404. Essa é a única maneira que conheço no momento ... Eu estaria interessado em conhecer outras ...
fonte
Confira este snipit. O GetResponse lançará uma WebRequestException. Pegue isso e você pode obter o código de status da resposta.
isso veio de http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx
fonte
Capture o tipo de exceção adequado
WebException
:fonte
e.Response
asHttpWebResponse
antes de obter acesso aoStatusCode
.Veja em MSDN sobre o status da resposta:
fonte
Para o pessoal do VB.NET que está navegando aqui, acredito que podemos detectar a exceção apenas se for realmente um 404. Algo como:
fonte
quando POST ou GET dados para o servidor usando a classe WebRequest, o tipo de exceção seria WebException. Abaixo está o código para exceção de arquivo não encontrado
fonte