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
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Path addizionali per gli asset in ASP.NET Core MVC
Migrare una service connection a workload identity federation in Azure DevOps
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Escludere alcuni file da GitHub Secret Scanning
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
I più letti di oggi
- Utilizzare una qualunque lista per i parametri di tipo params in C#
- Includere un button in un component ed esporne l'evento click in Angular
- #SQLServer #Modeling (codename Oslo) CTP di nov 2009 aggiornato per VS 2010 RC: http://u.aspitalia.com/fi
- .NET Conference Italia 2019 Live - Milano
- Accedere a file XML remoti con ASP.NET
- Creare una libreria CSS universale: Nav menu
- Utilizzare funzioni di istanza con le Azure Function
- A quick tour around Azure Dev Spaces