Come visualizzare una finestra di messaggio di errore in un'applicazione Web asp.net c #
-
19-08-2019 - |
Domanda
Ho un'applicazione Web ASP.NET e volevo sapere come visualizzare una finestra di messaggio di errore quando viene generata un'eccezione.
Ad esempio,
try
{
do something
}
catch
{
messagebox.write("error");
//[This isn't the correct syntax, just what I want to achieve]
}
[La finestra di messaggio mostra l'errore]
Grazie
Soluzione
Non è possibile visualizzare ragionevolmente una finestra di messaggio sul computer client o sul server. Per il computer client, ti consigliamo di reindirizzare a una pagina di errore con un messaggio di errore appropriato, magari includendo il messaggio di eccezione e la traccia dello stack, se lo desideri. Sul server, probabilmente vorrai fare un po 'di registrazione, nel registro eventi o in un file di registro.
try
{
....
}
catch (Exception ex)
{
this.Session["exceptionMessage"] = ex.Message;
Response.Redirect( "ErrorDisplay.aspx" );
log.Write( ex.Message + ex.StackTrace );
}
Nota che il " log " sopra dovrebbe essere implementato da te, magari usando log4net o qualche altra utility di registrazione.
Altri suggerimenti
Non puoi semplicemente chiamare messagebox.write perché sei disconnesso dal client. Dovresti registrare il codice javascript che mostra una finestra di messaggio:
this.RegisterClientScriptBlock(typeof(string), "key", string.Format("alert('{0}');", ex.Message), true);
l'utilizzo di MessageBox.Show () causerebbe la visualizzazione di una finestra di messaggio nel server e l'interruzione dell'ulteriore elaborazione del thread a meno che la casella non fosse chiusa.
Quello che puoi fare è
this.Page.ClientScript.RegisterStartupScript(this.GetType(),"ex","alert('" + ex.Message + "');", true);
questo mostrerebbe l'eccezione sul lato client, a condizione che l'eccezione non sia gorgogliata.
Il modo in cui l'ho fatto in passato è quello di popolare qualcosa sulla pagina con informazioni quando viene generata un'eccezione. MessageBox è per moduli Windows e non può essere utilizzato per moduli Web. Suppongo che potresti mettere un po 'di javascript nella pagina per fare un avviso:
Response.Write("<script>alert('Exception: ')</script>");
Non penso che vorresti mostrare i dettagli dell'eccezione. Abbiamo dovuto smettere di farlo perché uno dei nostri clienti non voleva che i loro utenti vedessero tutto ciò che era disponibile nei dettagli delle eccezioni. Prova a visualizzare una finestra JavaScript con alcune informazioni che spiegano che si è verificato un problema.
Se vuoi gestire tutti i tuoi errori in un unico posto, puoi usare il file global.asax (noto anche come file dell'applicazione globale) della tua applicazione web e lavorare con l'evento di errore dell'applicazione. In questo modo aggiungi il file dell'applicazione globale al tuo progetto, quindi sull'evento Application_Error inserisci un codice di gestione degli errori, come questo:
void Application_Error(object sender, EventArgs e)
{
Exception objErr = Server.GetLastError().GetBaseException();
string err = "Error Caught in Application_Error event\n" +
"Error in: " + Request.Url.ToString() +
"\nError Message:" + objErr.Message.ToString() +
"\nStack Trace:" + objErr.StackTrace.ToString();
System.Diagnostics.EventLog.WriteEntry("Sample_WebApp", err, System.Diagnostics.EventLogEntryType.Error);
Server.ClearError();
Response.Redirect(string.Format("{0}?exceptionMessage={1}", System.Web.VirtualPathUtility.ToAbsolute("~/ErrorPage.aspx"), objErr.Message));
}
In questo modo i dettagli tecnici dell'eccezione verranno registrati nel registro eventi di sistema (se è necessario controllare l'errore in seguito) Quindi su ErrorPage.aspx acquisisci il messaggio di eccezione dalla stringa di query sull'evento Page_Load. Come visualizzarlo dipende da te (puoi utilizzare l'avviso javascript suggerito sulle altre risposte o semplicemente passare il testo a un letterale asp.net
Spero che il suo aiuto. Acclamazioni
Se si utilizza .NET Core con MVC e Razor, sono disponibili diversi livelli di preelaborazione prima del rendering della pagina. Quindi ti suggerisco di provare a racchiudere un messaggio di errore condizionale nella parte superiore della pagina di visualizzazione, in questo modo:
In ViewController.cs:
if (file.Length < 800000)
{
ViewData["errors"] = "";
}
else
{
ViewData["errors"] = "File too big. (" + file.Length.ToString() + " bytes)";
}
In View.cshtml:
@if (ViewData["errors"].Equals(""))
{
@:<p>Everything is fine.</p>
}
else
{
@:<script>alert('@ViewData["errors"]');</script>
}