Utilizzo della dichiarazione lambda nella gestione delle eccezioni

1

Di seguito è riportato uno snippet di codice dall'applicazione MVP Win Forms e questa spiegazione sarebbe utile quando si risponde alle domande.

Il mio DAL non gestisce le eccezioni e sarà propagato fino al metodo chiamante nelle classi presenter in cui verrà gestita l'eccezione.

Sto utilizzando un singolo gestore chiamato ExecutAction(Action action) , quindi sto rilevando eccezioni in un unico posto anziché ripetere codice in ogni metodo.

Al momento, non sto registrando errori. Basta avvisare l'utente di un'azione e provare a mantenere il sistema attivo se possibile.

Quando vengono mostrati messaggi agli utenti, i presentatori useranno una classe statica chiamata MessagingService . (%codice%). In modo che io possa personalizzare tutte le scatole di massaggio in un unico posto.

        private void Search()
        {
            ExecutAction(() =>
            {
                var info = _DataService.GetByACNo(_model.AccountNumber);

                    if (info != null)
                    {
                        _Model = info ;
                        this.SetViewPropertiesFromModel(_Model, _View);
                    }
                    else
                    {
                        MessageBox.Show ("Bank account not found");
                    }
                });
            }


            private void ExecutAction(Action action)
            {
                try
                {
                    action();
                }

                catch (NullReferenceException e) { MessagingService.ShowErrorMessage(e.Message); }
                catch (System.Data.SqlTypes.SqlTypeException e) { MessagingService.ShowErrorMessage(e.Message); }
                catch (System.Data.SqlClient.SqlException e) { MessagingService.ShowErrorMessage(e.Message); }
            }
        }

Dovrei includere un gestore di eccezioni generale a questo, per essere in grado di gestire eventuali eccezioni impreviste?

Inoltre potresti mostrarmi un modo migliore per gestire la visualizzazione dei messaggi rispetto all'utilizzo di una statica?

L'uso delle istruzioni lambda in ogni chiamata di metodo ( ShowErrorMessage() ) degrada la leggibilità del codice?

Quando mostri ai messaggi degli utenti come mostrare prima un messaggio personalizzato come "Verifica la connessione al server" ecc. e poi se l'utente vuole più informazioni (come StackTrace / dettagli tecnici) lui / lei potrebbe premere un pulsante come ExecutAction(() => che è nella finestra di dialogo MessageBox?

    
posta CAD 14.06.2014 - 16:03
fonte

2 risposte

1

Prima di tutto, dovresti copiare il riferimento di action delegate instance prima di invocarlo per evitare problemi di threading, come questo:

private void ExecutionAction(Action action)
{
    var handler = action;
    if (handler == null)
    {
        return;
    }

    try
    {
        handler();    
    }
    catch (System.Data.SqlTypes.SqlTypeException e)
    {
        MessagingService.ShowErrorMessage(e.Message);
    }
    catch (System.Data.SqlClient.SqlException e) 
    { 
        MessagingService.ShowErrorMessage(e.Message);
    }
}

In secondo luogo, non dovresti prendere NullReferenceException s. Gli NRE indicano quasi sempre un bug di programmazione ed è meglio fallire velocemente invece di mostrare un messaggio di errore senza ripensarlo.

    
risposta data 08.07.2015 - 05:20
fonte
0

Should I include general exception handler to this, to be able to handle any unforeseen exceptions?

Sfortunatamente sì, devi farlo.

Does use of lambda statements in every method call (ExecutAction(() =>) degrade code readability?

Alcune persone dicono di si. Non devi usare lambda. Puoi utilizzare i normali metodi statici o di istanza.

Per evitare delegati, puoi cambiare il design. Quando si verifica un evento dell'interfaccia utente, è possibile utilizzare un codice generico con un identificatore di "azione", come un oggetto Command con un tipo o nome univoco, per eseguire il codice altrove (processori di comando) che utilizza i blocchi try / catch in un modo generico, invece di mettere tali blocchi all'interno di tutti i gestori di eventi.

    
risposta data 10.10.2014 - 18:32
fonte

Leggi altre domande sui tag