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
Migrare un progetto ASP.NET Core da .NET 6 a .NET 7
Usare Azure Application Gateway come reverse proxy per ASP.NET Core
Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
Gestire tipi complessi in query string grazie a IParsable in ASP.NET Core 7.0
Abilitare automaticamente Dependabot in tutti i repository di una organizzazione su GitHub
Definire le impostazioni di cache a livello di controller in ASP.NET Core 7
Utilizzare parametri a livello di controller nel routing di ASP.NET Core
Gestire la query string nell'output cache di ASP.NET Core
Impostare il forward degli header in un sito ASP.NET Core dietro a un reverse proxy
Leggere i dati di configurazione di ASP.NET Core da Azure Key Vault
Taggare la output cache in base al routing in ASP.NET Core
Gestire dati sensibili nella configurazione in ASP.NET Core
I più letti di oggi
- Monitorare i server on-premises con Azure Arc
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Sfruttare la local cache del browser tramite gli ETag in ASP.NET Core
- Taggare la output cache in base al routing in ASP.NET Core
- Sfruttare i tag nell'output cache di ASP.NET Core 7