Nello script #994 abbiamo visto come l'action filter HandleError possa essere utilizzato per mostrare una view personalizzata in caso di errore. Nel caso si vogliano mostrare view differenti a seconda della particolare eccezione sollevata dal controller, è possibile specificarle utilizzando la sintassi mostrata nell'esempio:
[HandleError(ExceptionType=typeof(DataException), View="DatabaseError")] [HandleError(ExceptionType=typeof(SecurityException), View = "SecurityError")] [HandleError] public ActionResult Throw(int id) { if (id == 1) throw new DataException(); if (id == 2) throw new SecurityException(); if (id == 3) throw new InvalidOperationException(); return View(); }
In questo modo è possibile visualizzare una pagina apposita per DataException e SecurityException, mentre gli altri tipi di eccezione verranno gestiti normalmente tramite la view Error.
Quando si usano diversi gestori, però, bisogna porre grande attenzione ai vincoli di ereditarietà tra le exception. Il runtime valuta gli attributi secondo un ordine che non è predicibile e seleziona il primo il cui Type sia compatibile con l'eccezione sollevata. Nell'esempio precedente, allora, il rischio è che il gestore generico venga valutato prima di DataException e quindi, anche in corrispondenza di questo tipo di eccezione, venga utilizzata la view Error piuttosto che DatabaseError. E' allora opportuno forzare questo ordine di valutazione tramite la proprietà Order, in modo da dare priorità ai tipi più specifici:
[HandleError(ExceptionType=typeof(DataException), View="DatabaseError", Order = 1)] [HandleError(ExceptionType=typeof(SecurityException), View="SecurityError", Order = 1)] [HandleError(Order = 2)] public ActionResult Throw(int id) { if (id == 1) throw new DataException(); if (id == 2) throw new SecurityException(); if (id == 3) throw new InvalidOperationException(); return View(); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire le chiamate a servizi esterni in ASP.NET Core e Blazor tramite Polly
Eseguire task temporizzati tramite hosted service in ASP.NET Core
Generare un QR Code da ASP.NET Web API
Avviare e arrestare programmaticamente un Hosted Service di ASP.NET Core
Reagire alle modifiche della configurazione di ASP.NET Core
Configuration strongly typed anche per singleton con IOptionsMonitor in ASP.NET Core
Autenticazione con Minimal API di ASP.NET Core 6
Iniettare servizi in un hosted service di ASP.NET Core
Gestire aree contestuali in un'applicazione Blazor
Usare l'option pattern per gestire la configurazione in ASP.NET Core
Impostare il claim desiderato per il nome utente in ASP.NET Core con Microsoft Identity
I più letti di oggi
- Utilizzare la parola chiave var con lambda expression e method group in C# 10
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- devConf 2022 - Online
- Log streaming di una Azure Container App
- Agenda di #devconf22 del 26/05 quasi al completo! Ce n'è per tutti i gusti: #dotnet, #aspnetcore, #blazor, #terraform, #githubAltre informazioni e iscrizioni su => https://aspit.co/devconf-22