Gestion des erreurs

Les classes WebRequest et WebResponse lèvent à la fois les exceptions système (comme ArgumentException) et les exceptions spécifiques au web (qui sont des WebException levées par la méthode GetResponse).

Chaque WebException comprend une propriété qui contient une valeur de l’énumération WebExceptionStatus. Vous pouvez examiner la propriété Status afin d’identifier l’erreur qui s’est produite et de prendre les mesures appropriées pour la résoudre.

Le tableau suivant décrit les valeurs possibles pour la propriété Status.

Statut Description
ConnectFailure Le service distant n’a pas pu être contacté au niveau du transport.
ConnectionClosed La connexion a été interrompue prématurément.
KeepAliveFailure Le serveur a fermé une connexion établie avec l’en-tête Keep-alive défini.
NameResolutionFailure Le service de noms n’a pas pu résoudre le nom d’hôte.
ProtocolError La réponse reçue du serveur était complète, mais indiquait une erreur au niveau du protocole.
ReceiveFailure Aucune réponse complète n’a été reçue du serveur distant.
RequestCanceled La demande a été annulée.
SecureChannelFailure Une erreur s’est produite dans un lien de canal sécurisé.
SendFailure Une demande complète n’a pas pu être envoyée au serveur distant.
ServerProtocolViolation La réponse du serveur n’était pas une réponse HTTP valide.
Succès Aucune erreur n’a été rencontrée.
Délai d'expiration Aucune réponse n’a été reçue pendant le délai défini pour la demande.
TrustFailure Un certificat de serveur n’a pas pu être validé.
MessageLengthLimitExceeded Un message a été reçu qui dépassait la limite spécifiée lors de l’envoi d’une demande ou de la réception d’une réponse du serveur.
Pending Une demande asynchrone interne est en attente.
PipelineFailure Cette valeur prend en charge l’infrastructure .NET Framework et n’est pas destinée à être utilisée directement dans votre code.
ProxyNameResolutionFailure Le service de résolution de nom n’a pas pu résoudre le nom d’hôte proxy.
UnknownError Une exception de type inconnu s’est produite.

Quand la propriété Status a la valeur WebExceptionStatus.ProtocolError, une WebResponse qui contient la réponse du serveur est disponible. Vous pouvez examiner cette réponse afin de déterminer la source réelle de l’erreur de protocole.

L’exemple suivant indique comment intercepter une WebException.

try
{  
    // Create a request instance.  
    WebRequest myRequest =
    WebRequest.Create("http://www.contoso.com");  
    // Get the response.  
    WebResponse myResponse = myRequest.GetResponse();  
    //Get a readable stream from the server.
    Stream sr = myResponse.GetResponseStream();  
  
    //Read from the stream and write any data to the console.  
    bytesread = sr.Read( myBuffer, 0, length);  
    while( bytesread > 0 )
    {  
        for (int i=0; i<bytesread; i++) {  
            Console.Write( "{0}", myBuffer[i]);  
        }  
        Console.WriteLine();  
        bytesread = sr.Read( myBuffer, 0, length);  
    }  
    sr.Close();  
    myResponse.Close();  
}  
catch (WebException webExcp)
{  
    // If you reach this point, an exception has been caught.  
    Console.WriteLine("A WebException has been caught.");  
    // Write out the WebException message.  
    Console.WriteLine(webExcp.ToString());  
    // Get the WebException status code.  
    WebExceptionStatus status =  webExcp.Status;  
    // If status is WebExceptionStatus.ProtocolError,
    //   there has been a protocol error and a WebResponse
    //   should exist. Display the protocol error.  
    if (status == WebExceptionStatus.ProtocolError) {  
        Console.Write("The server returned protocol error ");  
        // Get HttpWebResponse so that you can check the HTTP status code.  
        HttpWebResponse httpResponse = (HttpWebResponse)webExcp.Response;  
        Console.WriteLine((int)httpResponse.StatusCode + " - "  
           + httpResponse.StatusCode);  
    }  
}  
catch (Exception e)
{  
    // Code to catch other exceptions goes here.  
}  
Try  
    ' Create a request instance.  
    Dim myRequest As WebRequest = WebRequest.Create("http://www.contoso.com")  
    ' Get the response.  
    Dim myResponse As WebResponse = myRequest.GetResponse()  
    'Get a readable stream from the server.
    Dim sr As Stream = myResponse.GetResponseStream()  
  
    Dim i As Integer
    'Read from the stream and write any data to the console.  
    bytesread = sr.Read(myBuffer, 0, length)  
    While bytesread > 0  
        For i = 0 To bytesread - 1  
            Console.Write("{0}", myBuffer(i))  
        Next i  
        Console.WriteLine()  
        bytesread = sr.Read(myBuffer, 0, length)  
    End While  
    sr.Close()  
    myResponse.Close()  
Catch webExcp As WebException  
    ' If you reach this point, an exception has been caught.  
    Console.WriteLine("A WebException has been caught.")  
    ' Write out the WebException message.  
    Console.WriteLine(webExcp.ToString())  
    ' Get the WebException status code.  
    Dim status As WebExceptionStatus = webExcp.Status  
    ' If status is WebExceptionStatus.ProtocolError,
    '   there has been a protocol error and a WebResponse
    '   should exist. Display the protocol error.  
    If status = WebExceptionStatus.ProtocolError Then  
        Console.Write("The server returned protocol error ")  
        ' Get HttpWebResponse so that you can check the HTTP status code.  
        Dim httpResponse As HttpWebResponse = _  
           CType(webExcp.Response, HttpWebResponse)  
        Console.WriteLine(CInt(httpResponse.StatusCode).ToString() & _  
           " - " & httpResponse.StatusCode.ToString())  
    End If  
Catch e As Exception  
    ' Code to catch other exceptions goes here.  
End Try  

L’exemple de code précédent ne ferme pas l’objet Response à partir duquel WebException.Response il obtient. Pour plus d’informations sur la raison pour laquelle elle n’est pas fermée, consultez cette réponse StackOverflow.

Les applications qui utilisent la classe Socket lèvent des SocketException quand des erreurs se produisent sur le socket Windows. Les classes TcpClient, TcpListener et UdpClient sont générées sur la classe TcpClient et lèvent également des TcpListener.

Quand une SocketException est levée, la classe SocketException affecte à la propriété la dernière erreur de socket du système d’exploitation s’étant produite. Pour plus d’informations sur les codes d’erreur de socket, consultez la documentation relative aux codes d’erreur des API Winsock 2.0 dans MSDN.

Voir aussi