Eccezione durante la registrazione dell'eccezione: è corretto ignorarli?

1

La mia domanda è specifica per php, ma penso che possa essere utile in altre lingue.

Accedo a una tabella tutte le eccezioni che un codice può lanciare:

try{
 //Some code
 } catch (Exception $e) {
      $log = new Log(basename($_SERVER['PHP_SELF']), $_SESSION['id'], LogType::EXCEPTION, $e);
      try {
           $log ->addLog();
       } catch (Exception $e2) {
                //
       }
 }

La funzione addLog inserisce le informazioni di eccezione in un database. Ma (ad esempio se si perde la connessione con il database) questa funzione può generare un'eccezione. Non riesco a vedere cosa devo fare con questa eccezione se non ignorandola.

So che ignorare l'eccezione è una cattiva pratica, ma cosa posso fare in questo caso particolare?

Se non ci sono problemi a ignorarlo, c'è un modo migliore per indicare che questa eccezione non dovrebbe essere presa in considerazione?

    
posta Getz 29.04.2014 - 18:00
fonte

3 risposte

4

Qualunque cosa tu faccia, non ingoiare l'eccezione. Se qualcosa è rotto, devi saperlo. Ingerire un'eccezione è ragionevole solo in circostanze molto rare.

Quando rilevi un'eccezione, dovresti provare a registrarla in un archivio dati (database, visualizzatore eventi, qualsiasi cosa funzioni per te), in modo che qualcuno possa andare a cercare in un unico posto tutte le eccezioni.

Se la registrazione non riesce, ripristinare un meccanismo di registrazione più semplice che non dipende da una risorsa di rete. Normalmente accedo a un file di testo e poi chiedo all'utente di inviarmi una copia del file.

Infine, dovresti far sapere all'utente che qualcosa è andato storto. È possibile scegliere di visualizzare l'intera traccia dello stack o solo un semplice messaggio di errore. Non è consigliabile visualizzare una traccia stack completa per l'utente finale, poiché si tratta di un rischio per la sicurezza. Di solito visualizzo un messaggio user-friendly che richiede all'utente finale di contattare l'assistenza.

Da una nota a margine, ho anche visto un meccanismo di registrazione in cui il client inviava i dettagli degli errori al servizio di registrazione su HTTP. Se il servizio non fosse disponibile, il client riproverà la registrazione tre volte prima di fallire e tornare a un meccanismo di registrazione più semplice.

    
risposta data 29.04.2014 - 19:10
fonte
1

Dovresti assolutamente reagire a questa eccezione.

Il modo in cui lo fai dipende dal tuo contesto. Se la scrittura dei registri su un database fallisce, probabilmente è lo stesso db utilizzato dall'applicazione, che probabilmente è inattivo. Quindi questo potrebbe essere un buon momento per scrivere una e-mail ad un amministratore. Che, al contrario, può rendere il tuo server di posta molto impegnato e / o anche fallire.

La registrazione su un file è una buona idea. Tuttavia, se ti aspetti che il caso non accada mai, devi in qualche modo richiamare l'attenzione su quel file.

Se si tratta di un'applicazione importante, potresti voler pensare a monitorarla (Nagios, ad esempio, è uno strumento di monitoraggio). Questi strumenti di solito sono in grado di analizzare continuamente i file di registro per errori.

    
risposta data 29.04.2014 - 22:31
fonte
0

Ho avuto una funzione come fallback per il logging su file come @CodeART e @Andy sugested

function log(Exception $e) {
    $file = fopen('log/error.log', 'a+');
    if ($file !== false) {
        fwrite($file, $e->getMessage() . "\r\n" . $e->getTraceAsString());
        fclose($file);
    }
}

Potresti chiamarlo entro il secondo fermo. Per usarlo devi configurare il tuo ambiente e assicurarti che lo script fosse permessi di scrittura sulla tua directory di log

    
risposta data 30.04.2014 - 19:44
fonte

Leggi altre domande sui tag