Consigli necessari per rilanciare un'eccezione

0

Considera le seguenti codice:

public class ExceptionManager
{
    public static void TreatException(Exception ex)
    {
        if (ShowAndContinue(ex))
            // display a user-friendly message on what happened and let the app run.
        else
            throw ex;
    }

    // (more code)
}

(Si noti che quanto sopra è troppo semplificato in modo che l'attenzione sia focalizzata sulla mia preoccupazione)

IMHO Penso che il modo in cui viene lanciata l'eccezione sia sbagliato perché le informazioni di stacktrace sono perse. Il modo preferito (di nuovo, IMHO) per scrivere la riga throw sarebbe questo:

throw new UntreatableErrorException("Manager could not treat the exception.", ex);

In questo modo viene conservato lo stacktrace dell'eccezione originale.

Tuttavia, un mio collega sta sostenendo che fare ciò significherebbe perdere la capacità di catturare l'eccezione originale più bassa nello stack di chiamate, perché catch funziona con il tipo di eccezione e quindi una trappola di eccezione potrebbe essere impostata per catturare l'originale eccezione ma non UntreatableErrorException . Pertanto è meglio restituire l'istanza di eccezione originale, anche se ciò significa perdere lo stacktrace.

Quale di noi è proprio qui su quale dovrebbe essere la migliore pratica?

    
posta Crono 26.11.2014 - 19:25
fonte

1 risposta

5

Hai entrambi ragione.

Non vuoi perdere la traccia dello stack, ma potresti voler rilevare l'eccezione di livello inferiore.

Non avvolgere l'eccezione se non aggiunge informazioni.

Vorrei chiamare il tuo ExceptionManager e TreatException un po 'di odore di codice - stanno cercando troppo difficile per centralizzare la gestione delle eccezioni.

Per lanciare senza perdere la traccia dello stack:

public static bool ContinueAfterException(Exception ex)
{
    if (ShowAndContinue(ex))
    {
      // display a user-friendly message on what happened and let the app run.
      return true;
    }

    return false;
}

Altrove:

try
{ 
  // some exception throwing code
}
catch(Exception ex)
{
    if(!ContinueAfterException(ex))
        throw; // no ex
}
    
risposta data 26.11.2014 - 19:28
fonte