Come gestire le eccezioni nelle app di rete (HTML)

[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]

In questo argomento viene illustrato come gestire le eccezioni quando si usano API di rete in un'app di Windows Store scritta in JavaScript e HTML.

Cosa sapere

Tecnologie

Prerequisiti

  • Le informazioni seguenti si applicano alle app di Windows Store che usano API di rete per stabilire connessioni remote. Questo argomento riguarda le app scritte in JavaScript e HTML per Windows 8.1, Windows Phone 8.1 o Windows Server 2012 R2.

    Per altre informazioni sulla gestione delle eccezioni nelle app di Windows Store scritte in C++/XAML e nelle app che usano .NET Framework 4.5 in C#, VB.NET o C++ gestito in Windows 8.1, Windows Phone 8.1 o Windows Server 2012 R2, vedi Gestione delle eccezioni nelle app di rete.

Eccezioni nelle app di rete

Le eccezioni nelle app indicano che si è verificato un problema o un errore grave. Le eccezioni possono verificarsi per diversi motivi. L'eccezione può essere causata da problemi del codice. In altri casi, in particolare se si usano API di rete, l'eccezione può essere causata da cambiamenti nella connessione di rete e da altri problemi con la rete.

Le cause delle eccezioni correlate all'uso di API di rete includono quanto segue:

  • Errori di convalida dei parametri
  • Errori nella risoluzione dei nomi durante la ricerca di nomi host o URI
  • Perdita di connessione di rete
  • Errori della connessione di rete con socket e API client HTTP
  • Errori del server di rete o dell'endpoint remoto
  • Errori di rete vari

Le eccezioni dovute a errori di rete (ad esempio perdita di connettività, errori di connessione e problemi di server e HTTP) possono verificarsi in qualsiasi momento. Questi errori causano la generazione di eccezioni. Se non vengono gestite dall'app, le eccezioni possono causare la chiusura improvvisa dell'intera app da parte del runtime.

Per le chiamate alla maggior parte dei metodi di rete asincroni è pertanto necessario scrivere codice relativo alla gestione delle eccezioni. Quando si verifica un'eccezione, è talvolta possibile ritirare il metodo di rete per tentare di risolvere il problema. In altri casi, si può prevedere che l'app continui a funzionare senza connessione di rete usando i dati precedentemente memorizzati nella cache.

Le app di Windows Runtime generano in genere una singola eccezione. Il gestore delle eccezioni può recuperare ulteriori dettagli sulla causa in modo da comprendere meglio l'errore e prendere le decisioni appropriate.

JavaScript supporta un metodo per accedere a queste informazioni dettagliate. Un'eccezione viene proiettata come un valore HRESULT all'interno delle app di Windows Runtime. Il file Winerror.h include un elenco molto lungo di possibili valori HRESULT contenenti errori di rete.

Le API di rete supportano diversi metodi per recuperare informazioni dettagliate sulla causa di un'eccezione.

  • Un metodo helper che converte il valore HRESULT dell'eccezione in un valore di enumerazione.
  • Il metodo non elaborato dipende dal linguaggio usato per recuperare il valore HRESULT.

Eccezioni in Windows.Networking.Sockets

Lo spazio dei nomi Windows.Networking.Sockets offre pratici metodi helper ed enumerazioni per gestire gli errori quando si usano socket e WebSocket. Ciò può risultare utile per gestire specifiche eccezioni di rete in modo diverso nell'app.

Un errore verificatosi in un'operazione DatagramSocket, StreamSocket o StreamSocketListener viene restituito come valore HRESULT. Il metodo SocketError.GetStatus viene usato per convertire un errore di rete da un'operazione socket in un valore di enumerazione SocketErrorStatus. La maggior parte dei valori di enumerazione SocketErrorStatus corrisponde a un errore restituito dall'operazione socket di Windows nativa. È possibile applicare filtri per specifici valori di enumerazione di SocketErrorStatus allo scopo di modificare il comportamento dell'app a seconda della causa dell'eccezione.

Un errore verificatosi in un'operazione MessageWebSocket o StreamWebSocket viene restituito come valore HRESULT. Il metodo WebSocketError.GetStatus viene usato per convertire un errore di rete da un'operazione WebSocket in un valore di enumerazione WebErrorStatus. La maggior parte dei valori di enumerazione WebErrorStatus corrisponde a un errore restituito dall'operazione client HTTP nativa. È possibile applicare filtri per specifici valori di enumerazione di WebErrorStatus allo scopo di modificare il comportamento dell'app a seconda della causa dell'eccezione.

Il codice di esempio seguente mostra come filtrare un'eccezione tramite l'enumerazione WebErrorStatus.

var uri = new Uri("https://www.contoso.com");
var messageWebSocket = new Windows.Networking.Sockets.MessageWebSocket();


// Always catch network exceptions for async methods
messageWebSocket.ConnectAsync(uri).done(function () {
        // get completed
    }, onError);

function onError(reason) {
    // Details in reason.message and reason.number       
    var errorStatus = Windows.Networking.Sockets.WebSocketError.getStatus(reason.number);
    if (errorStatus === Windows.Web.WebErrorStatus.cannotConnect || 
        errorStatus === Windows.Web.WebErrorStatus.notFound || 
        errorStatus === Windows.Web.WebErrorStatus.requestTimeout) {
        WinJS.log && WinJS.log("Cannot connect to the server");
    }
    else {
        WinJS.log && WinJS.log("Failed to connect: " + errorStatus);
    }
}

Per quanto riguarda gli errori di convalida dei parametri, le app possono usare anche il valore HRESULT dell'eccezione per ottenere informazioni più dettagliate sull'errore che ha causato l'eccezione. Nelle app scritte in JavaScript, l'oggetto Error rappresenta un errore che si verifica durante l'esecuzione di un'app in caso di eccezione. La proprietà Error.number restituisce il valore HRESULT assegnato alla specifica eccezione. I valori HRESULT possibili sono elencati nel file di intestazione Winerror.h. Per gran parte degli errori di convalida dei parametri, il valore HRESULT restituito è E_INVALIDARG.

Eccezioni in Windows.Networking.BackgroundTransfer

Lo spazio dei nomi Windows.Networking.backgroundTransfer dispone di pratici metodi helper e usa le enumerazioni presenti nello spazio dei nomi Windows.Networking.Sockets per gestire gli errori. Ciò può risultare utile per gestire specifiche eccezioni di rete in modo diverso nell'app.

Eventuali errori riscontrati nel metodo asincrono dello spazio dei nomi Windows.Networking.backgroundTransfer vengono restituiti come valori HRESULT. Il metodo BackgroundTransferError.GetStatus viene usato per convertire un errore di rete da un trasferimento in background in un valore di enumerazione WebErrorStatus. La maggior parte dei valori di enumerazione WebErrorStatus corrisponde a un errore restituito dall'operazione client HTTP o FTP nativa. È possibile applicare filtri per specifici valori di enumerazione di WebErrorStatus allo scopo di modificare il comportamento dell'app a seconda della causa dell'eccezione.

Per quanto riguarda gli errori di convalida dei parametri, le app possono usare anche il valore HRESULT dell'eccezione per ottenere informazioni più dettagliate sull'errore che ha causato l'eccezione. Nelle app scritte in JavaScript, l'oggetto Error rappresenta un errore che si verifica durante l'esecuzione di un'app in caso di eccezione. La proprietà Error.number restituisce il valore HRESULT assegnato alla specifica eccezione. I valori HRESULT possibili sono elencati nel file di intestazione Winerror.h. Per gran parte degli errori di convalida dei parametri, il valore HRESULT restituito è E_INVALIDARG.

Eccezioni in Windows.Web.Http

Lo spazio dei nomi Windows.Web.Http non è provvisto di una funzione di convenienza. Pertanto, in app che usano HttpClient e altre classi dello spazio dei nomi, si deve usare il valore HRESULT.

Nelle app scritte in JavaScript, l'oggetto Error rappresenta un errore che si verifica durante l'esecuzione di un'app in caso di eccezione. La proprietà Error.number restituisce il valore HRESULT assegnato alla specifica eccezione. La proprietà Error.description restituisce il messaggio che descrive l'eccezione. Per alcune eccezioni, però, potrebbe mancare il valore della proprietà Error.description. Gran parte dei valori HRESULT possibili è elencata nel file di intestazione Winerror.h. È possibile applicare filtri per specifici valori di enumerazione di HRESULT allo scopo di modificare il comportamento dell'app a seconda della causa dell'eccezione.

Per gran parte degli errori di convalida dei parametri, il valore HRESULT restituito è E_INVALIDARG. Per alcune chiamate di metodo non valide, il valore HRESULT restituito è E_ILLEGAL_METHOD_CALL.

Il codice di esempio seguente mostra come filtrare un'eccezione tramite il valore HRESULT.

var uri = new Uri("http://example.com/datalist.aspx");
var httpClient = new HttpClient();

// Always catch network exceptions for async methods
httpClient.GetStringAsync(uri).done(function () {
        // get completed
    }, onError);


function onError(reason) {
    // Details in error.message and error.number       
    var errorStatus = reason.number;
    if (errorStatus === INET_E_RESOURCE_NOT_FOUND || 
        errorStatus === INET_E_CANNOT_CONNECT ) {
        WinJS.log && WinJS.log("Cannot connect to the server");
    }
    else {
        WinJS.log && WinJS.log("Failed to connect: " + errorStatus);
    }
}

Argomenti correlati

Altre risorse

Aggiunta del supporto di rete

Come impostare le opzioni di connettività in background

Trasferimento di dati in background

Risoluzione dei problemi e debug delle connessioni di rete

Riferimento

HttpClient

MessageWebSocket

StreamSocket

StreamWebSocket

Windows.Networking.BackgroundTransfer

Windows.Networking.Sockets

Windows.Web.Http