Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Gestire le eccezioni

Fornire al client un feedback il più possibile accurato quando si presenta un errore
Fornire al client un feedback il più possibile accurato quando si presenta un errore
Link copiato negli appunti

Come accade per lo sviluppo di un qualsiasi tipo di software, anche nell'implementazione di Web API è molto importante gestire al meglio le eccezioni che si possono verificare durante l'esecuzione. È fondamentale fornire al client un feedback il più possibile accurato quando qualcosa non va come ci si aspettava, in modo che possa risultare chiara la causa del problema.

Nella maggior parte dei casi, in presenza di eccezioni durante l'esecuzione di codice non gestito sul server, viene generato dal sistema un messaggio HTTP con codice di stato 500, Internal Server Error. Tuttavia non sempre questo codice risulta appropriato in quanto l'errore si verifica sul server, ma può avere origine dai dati inviati dal client.

Ad esempio, se il client invia un parametro in un formato errato, la non corretta gestione dell'eccezione generata non darà informazioni sufficienti al client per porre rimedio a questa situazione. Anzi, la segnalazione indotta dal codice di stato 500 porta a pensare che si tratti di un problema a carico della Web API.

Come gestire opportunamente le eccezioni in ASP.NET Web API per poter fornire un codice di stato adeguato al client? In alcuni esempi di codice di questa guida abbiamo già utilizzato la classe HttpResponseException. Questa classe consente di restituire un codice di stato HTTP specificato da noi. Ad esempio, la seguente istruzione

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));

consente di restituire il codice 404, Not Found. La risposta inviata al client contiene un messaggio standard il più possibile generico. Se vogliamo personalizzare la risposta da inviare al client possiamo fare come nel seguente esempio:

var resp = new HttpResponseMessage(HttpStatusCode.NotFound);
resp.Content = new StringContent("Nessuna voce trovata in corrsipondenza di " + id +"");
resp.ReasonPhrase = "Voce non trovata";
throw new HttpResponseException(resp);

In questo caso abbiamo specificato il messaggio associato al codice HTTP ed un contenuto da visualizzare eventualmente nel caso in cui il client sia un Web browser.

È però possibile personalizzare la gestione delle eccezioni creando un Exception filter, cioè un filtro eseguito ogni qualvolta si verifica un'eccezione non gestita nel codice della nostra Web API.

Per creare un Exception filter occorre definire una classe che derivi da System.Web.Http.Filters.ExceptionFilterAttribute ed effettuare l'override del metodo OnException.

Il seguente esempio mostra l'implementazione di un Exception filter che restituisce il codice di stato 400, Bad Request, quando si verifica un'eccezione che riguarda gli argomenti di una funzione.

namespace Glossario.Filters
{
    using System;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http.Filters;
    public class ExceptionHanlder : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {
            if ((context.Exception is ArgumentException) || (context.Exception is ArgumentNullException))
            {
                context.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
            }
        }
    }
}

La risposta al client viene inviata assegnando un'istanza di HttpResponseMessage alla proprietà Response del contesto dell'azione appena eseguita.

Per poter abilitare il filtro occorre registrarlo, come al solito, in corrispondenza del metodo Application_Start() in Global.asax:

GlobalConfiguration.Configuration.Filters.Add(new Glossario.Filters.ExceptionHanlder());

Sfruttando questo meccanismo abbiamo la possibilità di personalizzare la gestione degli errori della nostra Web API, sia fornendo una risposta più adeguata ai client, sia attivando un meccanismo di memorizzazione e di avvisi al personale tecnico in corrispondenza di eccezioni critiche.

Un'importante osservazione da tenere presente quando si implementa un Exception filter è che le eccezioni generate dalla nostra applicazione tramite HttpResponseException non vengono intercettate dal filtro. Infatti questa classe ha proprio lo scopo di consentire una gestione personalizzata delle eccezioni ed avrebbe poco senso gestirla nuovamente in un Exception filter.

Ti consigliamo anche