Condividi tramite


Gestione degli errori

Le classi WebRequest e WebResponse generano sia eccezioni di sistema, ad esempio ArgumentException, sia eccezioni specifiche del Web, ovvero eccezioni WebExceptions generate dal metodo GetResponse.

Ciascuna WebException include una proprietà Status che contiene un valore tratto dall'enumerazione WebExceptionStatus. È possibile esaminare la proprietà Status per determinare l'errore che si è verificato e prendere le misure opportune per risolverlo.

Nella tabella che segue sono indicati i possibili valori della proprietà Status.

Status Descrizione
ConnectFailure Non è stato possibile contattare il servizio remoto al livello di trasporto.
ConnectionClosed La connessione è stata chiusa prematuramente.
KeepAliveFailure È stata chiusa una connessione con il server stabilita con l'impostazione Keep-Alive.
NameResolutionFailure Non è stato possibile risolvere il nome dell'host tramite il servizio di risoluzione dei nomi.
ProtocolError La risposta ricevuta dal server era completa ma indicava un errore al livello di protocollo.
ReceiveFailure Non è giunta alcuna risposta completa dal server remoto.
RequestCanceled La richiesta è stata annullata.
SecureChannelFailure Si è verificato un errore in un collegamento su canale protetto.
SendFailure Non è stato possibile inviare una richiesta completa al server remoto.
ServerProtocolViolation La risposta del server non era una risposta HTTP valida.
Success Non si è verificato alcun errore.
Timeout Non è stata ricevuta alcuna risposta entro l'intervallo di attesa impostato per la richiesta.
TrustFailure Non è stato possibile convalidare un certificato server.

Quando il valore della proprietà Status è WebExceptionStatus.ProtocolError è disponibile una WebResponse contenente la risposta del server. È possibile determinare l'effettiva origine dell'errore di protocollo esaminando la risposta.

Nell'esempio che segue viene illustrato come intercettare una WebException.

try 
{
    // Create a request instance.
    WebRequest myRequest = 
    WebRequest.Create("https://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.
}
[Visual Basic]
Try
    ' Create a request instance.
    Dim myRequest As WebRequest = WebRequest.Create("https://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

Le applicazioni in cui si utilizza la classe Socket consentono di generare eccezioni SocketExceptions quando si verificano errori sul socket Windows. Le classi TCPClient, TCPListener e UDPClient sono costruite sulla base della classe Socket e consentono di generare a loro volta eccezioni SocketExceptions.

Quando viene generata una SocketException, nella classe SocketException la proprietà ErrorCode verrà impostata sull'ultimo errore di socket del sistema operativo verificatosi. Per ulteriori informazioni sui codici di errore di socket, vedere la documentazione relativa ai codici di errore dell'interfaccia API di Winsock 2.0 in MSDN.

Vedere anche

Nozioni fondamentali sulla gestione delle eccezioni | Invio di richieste di dati