Che cosa deve fare un'applicazione quando si verifica un errore che notifica all'utente un errore?

2

Dire che ho un'applicazione, e scrive (tra le altre cose) errori in un file di registro. È il primo posto in cui all'utente viene chiesto di andare e controllare se c'è stato un problema. Supponiamo anche che questa sia un'applicazione critica a cui non è consentito solo arrestarsi in modo anomalo.

Per amor di discussione, diremo anche che tutte le eccezioni vengono registrate. Sono sulla barca che dice che questa è una pessima idea, ma correremo con essa per il bene di questo problema immaginario.

Come dovrebbe l'applicazione gestire idealmente la situazione in cui non è completamente in grado di scrivere sul suo log? Dì a causa della mancanza di spazio su disco, del numero di handle di file esaurito o di un problema di autorizzazioni / accesso.

A seconda della ragione esatta, naturalmente, potrebbe essere in grado di risolvere parzialmente se stessa. Se non ci fosse spazio libero su disco, per esempio potrebbe essere ragionevole trascinare il log corrente per scrivere una riga che dice di non avere spazio sul disco, a scapito della perdita del contenuto del registro. Anche se questo è molto inutile se qualcosa di esterno sta mangiando spazio e si tradurrebbe solo in svuotamenti dei registri.

Potrebbe essere prudente accedere a un buffer interno, in modo che, una volta risolta la situazione, i dati non vadano persi, ma lasciati troppo a lungo questo semplicemente fa memoria sulla memoria.

Quindi, cosa ne pensi, come deve essere gestito un errore che notifica all'utente di un errore? Soprattutto con un occhio alle applicazioni headless / incustodite che normalmente venivano monitorate solo guardando i loro log.

    
posta PhonicUK 23.02.2015 - 23:26
fonte

4 risposte

5

Un modo è di mantenere un file di log di "sistema" che di solito viene tenuto vuoto, ma è pre-allocato. Quindi, per errori veramente gravi, si scrive l'errore in questo percorso che è garantito sia disponibile (beh ...) e che abbia spazio sufficiente per scrivere i messaggi su di esso. Questo dovrebbe utilizzare un sistema di registrazione degli errori diverso e molto semplice per evitare errori nel sottosistema di registrazione.

    
risposta data 24.02.2015 - 12:13
fonte
3

Sostituire l'ultima voce del registro con una nuova voce di registro che indica che il registro è pieno e ignorare in modo silenzioso tutte le voci di registro successive. Ciò conserva il resto del registro e fornisce un indicatore di ciò che è accaduto alle voci del registro perse.

    
risposta data 23.02.2015 - 23:29
fonte
1

Se il commento di Dan fosse stato una risposta, avrei votato a favore, ma dal momento che non è ...

Ci sono 2 tipi di errori in cui il recupero è pura fortuna, se riesci a ottenere abbastanza lontano da tentare il recupero. "Memoria insufficiente" e "Spazio su disco insufficiente". Pertanto, la maggior parte delle applicazioni non tenta nemmeno di recuperare se si verifica una di queste situazioni. Si bloccano semplicemente.

Come ha detto il commento di Dan, l'unico modo in cui le applicazioni gestiscono in modo sicuro e affidabile questi tipi di errori è assicurando che non si verifichino mai. Ciò richiede il monitoraggio dello stato dello spazio su disco e della memoria e quando scende al di sotto di una certa soglia, l'applicazione può provare a liberare spazio. Se ciò non funziona (perché l'applicazione non è responsabile della perdita di memoria), l'applicazione deve eseguire un'uscita ordinata prima che la memoria sia esaurita.

Per quanto riguarda cosa fare quando si scrive una voce di registro non riesce. La mia registrazione funziona sempre in un thread in background e fa uso di code di messaggi. Se la scrittura della voce di registro non riesce, LogThread reimposterà LogEntry nella parte anteriore della coda messaggi e quindi tenterà di aprire un nuovo file di registro per la scrittura. Se viene aperto un nuovo file, procedere normalmente all'elaborazione delle voci del registro dalla coda. In caso contrario, attendere un po 'e riprovare. Non puoi far altro che continuare a provarci. Inoltre, si desidera limitare il numero di voci consentite nella coda dei messaggi o si verificherà l'errore "Memoria esaurita" perché tutte le voci del registro sono memorizzate.

Suppongo che altre possibili opzioni includano:

  • Scrivi su un altro tipo di registro (ad esempio Registro applicazioni di Windows).
  • Invia i dati a una porta seriale
  • Connessione a un server di errore esterno e invio di messaggi ad esso
  • Assicurati che il tuo sistema abbia una memoria di backup (o controlli se è collegata una memoria aggiuntiva) e scrivici.
  • Controlla se è collegata una stampante e scrivici.
  • Alcune schede hanno NVRAM, scrivici.
risposta data 24.02.2015 - 23:04
fonte
0

Come dovrebbe l'applicazione gestire idealmente la situazione in cui non è completamente in grado di scrivere sul suo log? Dì a causa della mancanza di spazio su disco, del numero di handle di file esaurito o di un problema di autorizzazioni / accesso.

Se non puoi scrivere nei log, non puoi scrivere nei log. È praticamente fuori controllo finché la causa non viene identificata e risolta. Nel frattempo, per motivi di notifica e di tornare almeno ad una sorta di registrazione, scrivi ciò che in genere esegui il logout da qualche altra parte.

Come misura temporanea, forse scrivere in un negozio remoto? Ci si basa su una connessione a questa posizione remota, che potrebbe presentare un altro insieme di problemi, ma almeno si spera (si spera) di risolvere molti dei problemi che potrebbero derivare dall'accesso locale (spazio su disco, permessi, ecc.). In alternativa (ultima risorsa), notificare le persone rilevanti di eccezioni tramite e-mail. Lo farei comunque nell'istante in cui si verifica un'eccezione nella registrazione dei problemi.

    
risposta data 24.02.2015 - 12:34
fonte

Leggi altre domande sui tag