Domanda

Qual è una buona pratica di gestione degli errori per un sito asp.net? Esempi? Grazie!

È stato utile?

Soluzione

Come con qualsiasi progetto .net, trovo che il modo migliore sia quello di catturare specifici tipi di errore solo se possono accadere nella pagina data.

Ad esempio, è possibile rilevare Eccezioni formato per un input fornito dagli utenti (in caso di errore la convalida JavaScript non riesce e non si è utilizzato il tryparse) ma lasciare sempre la cattura dell'eccezione di livello superiore al gestore di errori globale.

     try
        {
            //Code that could error here
        }
        catch (FormatException ex)
        {
            //Code to tell user of their error
            //all other errors will be handled 
            //by the global error handler
        }

Puoi utilizzare l'open source elmah (Error Logging Modules and Handlers) per ASP .Net per eseguire questo errore di livello superiore / globale per te, se lo desideri.

Utilizzando elmah puoi creare un registro degli errori che è visualizzabile anche se semplice da configurare l'interfaccia web. Puoi anche filtrare diversi tipi di errori e avere pagine di errore personalizzate per diversi tipi di errore.

Altri suggerimenti

Una pratica che trovo particolarmente utile è quella di creare una pagina di errore generica, quindi impostare defaultRedirect sul nodo customErrors di web.config su quella pagina di errore.

Quindi imposta global.asax per registrare tutte le eccezioni non gestite e poi inseriscile (le eccezioni non gestite) in una proprietà statica su una classe (ho una classe chiamata ErrorUtil con una proprietà LastError statica). La tua pagina di errore può quindi guardare questa proprietà per determinare cosa visualizzare all'utente.

Maggiori dettagli qui: http://www.codeproject.com/KB/aspnet /JcGlobalErrorHandling.aspx

Beh, è ??abbastanza aperto, il che è completamente bello. Ti farò riferimento a una parola .doc che puoi scaricare da Dot Net Spider , che è in realtà la base per lo standard di codice della mia piccola azienda. Lo standard include alcuni utili suggerimenti per la gestione degli errori.

Uno di questi esempi di eccezioni (non ricordo se questo è originale al documento o se lo abbiamo aggiunto al documento): Non fare mai un'eccezione & # 8220; cattura l'eccezione e non fare nulla. & # 8221; Se nascondi un'eccezione, non saprai mai se si è verificata l'eccezione. Dovresti sempre cercare di evitare le eccezioni controllando tutte le condizioni di errore a livello di codice.

Esempio di cosa non fare:

try
{
   ...
}
catch{}

Molto cattivo a meno che tu non abbia una buona ragione per farlo.

È necessario assicurarsi di poter rilevare la maggior parte degli errori generati dall'applicazione e visualizzare un messaggio descrittivo per gli utenti. Ma ovviamente non puoi catturare tutti gli errori per cui puoi usare web.config e defaultRedirect da un altro utente. Un altro strumento molto utile per registrare gli errori è ELMAH. ELMAH registrerà tutti gli errori generati dalla tua applicazione e te li mostrerà in modo molto leggibile. Collegare ELMAH all'applicazione è semplice come aggiungere poche righe di codice nel file web.config e allegare l'assembly. Dovresti assolutamente provare ELMAH che ti farà letteralmente risparmiare ore e ore di dolore.

http://code.google.com/p/elmah/

  1. Codice difensivo all'interno di ogni pagina per le eccezioni che prevedi possano accadere e gestirle in modo appropriato, in modo da non disturbare l'utente ogni volta che si verifica un'eccezione.

  2. Registra tutte le eccezioni, con un riferimento.

  3. Fornire una pagina di errore generica, per eventuali eccezioni non gestite, che fornisce un riferimento da utilizzare per il supporto (il supporto può identificare i dettagli dai registri). Non visualizzare l'eccezione effettiva, poiché la maggior parte degli utenti non la capirà ma costituisce un potenziale rischio per la sicurezza in quanto espone informazioni sul sistema (potenzialmente password ecc.).

  4. Non catturare tutte le eccezioni e non fare nulla con esse (come nella risposta sopra). Non c'è quasi mai una buona ragione per farlo, a volte potresti voler prendere un'eccezione specifica e non fare deliberatamente alcuna, ma questo dovrebbe essere usato saggiamente.

Non è sempre una buona idea reindirizzare l'utente a una pagina di errore standard. Se un utente sta lavorando a un modulo, potrebbe non voler essere reindirizzato lontano dal modulo su cui sta lavorando. Ho inserito tutto il codice che potrebbe causare un'eccezione all'interno di un blocco try / catch e all'interno del blocco catch ho emesso un messaggio di avviso che avvisava l'utente che si era verificato un errore e ho registrato l'eccezione in un database tra cui input di modulo, stringa di query , ecc. Sto comunque sviluppando un sito interno, quindi la maggior parte degli utenti mi chiama solo se ha un problema. Per un sito pubblico, potresti voler usare qualcosa come elmah.

public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
    {
        string authenticationID = string.Empty;
        int customerID = 0;
        string message = string.Empty;
        DA_Customer oDACustomer = new DA_Customer();

        using (TransactionScope scope = new TransactionScope())
        {
            if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
            {
                // if a new student
                if (oCustomerInfo.CustId == 0)
                {
                    oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
                    oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
                    authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
                    oCustLessonBookInfo.CustId = customerID;
                }
                else // if existing student
                {
                    oCustomerInfo.UpdatedByCustomer = "Y";
                    authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
                }
                message = authenticationID;
                // insert lesson booking details
                new DA_Lesson().BookLesson(oCustLessonBookInfo);
            }

            else
            {
                message = "login exists";
            }
            scope.Complete();
            return message;
        }

    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top