Invio di eccezioni come argomenti di evento

5

È una buona idea inviare eccezioni come EventArgs in C #? (E in realtà non lanciare l'eccezione).

Ho una classe che esegue un'attività asincrona da molto tempo. Se qualcosa va storto nel mezzo dell'attività, genererà un evento di errore. È una buona idea aggiungere un'eccezione come parte degli argomenti dell'evento, o sarebbe meglio usare le enumerazioni?

Questa classe è solo una delle tante che implementa una determinata interfaccia. Tutte le classi in questa interfaccia generano l'evento Errore quando qualcosa va storto. Ogni classe che implementa questa interfaccia si imbatterà in diversi tipi di errori.

Quali sono alcune delle migliori pratiche in un caso come questo? L'invio di un'eccezione come argomento e in realtà non lo fa sembrare un po 'sbagliato.

    
posta Eliezer Steinbock 07.09.2015 - 15:27
fonte

2 risposte

6

Is it a good idea to send Exceptions as EventArgs in C#?

Enh? Non è un'idea grande .

Is it a good idea to add an Exception as part of the event arguments, or would it be better to use enums?

Se hai una serie fissa di modi in cui l'attività a lungo termine potrebbe fallire, allora l'enum potrebbe avere senso. Dal momento che dici che ci sono diversi implementatori per questa interfaccia, probabilmente hai un insieme aperto di modi in cui può fallire, rendendo l'eccezione più appetibile.

What are some of the best practices in a case such as this?

In generale, non mi piacciono gli eventi per questo genere di cose. Non sei garantito che qualcuno stia ascoltando. Dal momento che qualcosa è già andato storto, è probabile che uno dei tuoi gestori di eventi finisca nei binari, interrompendo la catena e / o lanciando un'eccezione nel gestore, causando problemi.

Vorrei vedere se non è possibile cambiarlo a più di un delegato di gestore di errori singolo, magari usando classi di base astratte per forzarlo a essere fornito tramite il costruttore piuttosto che la costruzione di post aggiunta (che non si può davvero garantire al momento della compilazione).

Detto questo, passare le eccezioni è un po 'puzzolente, ma non è terribile in casi come questo. Voglio dire, stai prendendo un'eccezione e stai chiedendo una strategia per affrontarla. La conversione dell'eccezione in qualcos'altro (con probabile perdita di informazioni) sembra un sovraccarico / confusione non necessario.

    
risposta data 07.09.2015 - 15:59
fonte
3

Da un punto di vista puramente teorico, (indipendentemente dalla particolare situazione che hai a portata di mano), un evento indica una transizione di stato di un sistema. Ora, se si verifica un errore durante l'elaborazione di una richiesta, idealmente, il sistema dovrebbe avere un meccanismo di rollback incorporato, quindi non dovrebbe verificarsi alcuna transizione dello stato, pertanto non dovrebbe essere emesso alcun evento. Se, tuttavia, si verifica una transizione di stato, è necessario pubblicare un evento, ma dovrebbe contenere solo informazioni sulla transizione dello stato. Le informazioni di errore non rientrano in questa immagine; è irrilevante. Gli osservatori degli eventi si aspettano di essere informati sulle transizioni in modo da prendere le misure appropriate, non hanno alcun interesse e non sono interessati a sapere assolutamente nulla sugli errori.

Ora, tutto ciò non è completamente correlato alla risposta di una richiesta. Quando un client invia una richiesta, il server restituisce una risposta a tale client e solo a quel cliente . (Inoltre, se l'elaborazione dell'evento comporta un cambiamento di stato, emetterà un evento di modifica dello stato per tutti gli osservatori registrati, ma si tratta di un problema diverso.) Questa risposta al cliente richiedente dovrebbe, ovviamente, contenere informazioni di errore in caso di fallimento. Il fatto che tu stia utilizzando un meccanismo di eventi per implementare le tue risposte è del tutto irrilevante, e in realtà svolge il ruolo di una falsa pista in questa discussione. Quindi, includere un vero oggetto di eccezione all'interno di una risposta mi sembra perfettamente legittimo.

    
risposta data 07.09.2015 - 17:09
fonte

Leggi altre domande sui tag