2012-07-03 8 views
6

Nella maggior parte dei casi, è possibile rilevare eccezioni in Java, anche se non selezionate. Ma non è necessariamente possibile fare qualcosa al riguardo (ad esempio, fuori dalla memoria).Quando si dovrebbe arrestare un'applicazione a causa di un'eccezione in Java (problema di progettazione)?

In altri casi, il problema che sto cercando di risolvere è un principio di progettazione. Sto cercando di impostare un principio di progettazione o una serie di regole che indicano quando si dovrebbe rinunciare a una situazione eccezionale, anche se viene rilevata in tempo. L'obiettivo è cercare di non bloccare l'applicazione il più possibile.

Qualcuno ha già fatto brainstorming e comunicato a riguardo? Sto cercando casi generici specifici e possibili soluzioni, o regole del pollice.

UPDATE

suggerimenti finora:

  • smettere di correre se la coerenza dei dati può essere compromessa
  • smettere di correre se i dati possono essere cancellati
  • smettere di funzionare se non si può fare nulla (Memoria insufficiente ...)
  • Interrompere l'esecuzione se il servizio chiave non è disponibile o perché mes disponibile e non può essere riavviato

  • Procedimento/servizio dovrebbe controllare se può eseguire il suo compito da uno stato stabile, se non si deve informare l'utente (log) e fare nulla

  • Se applicazione deve essere fermato , degradare la grazia di possibili
  • Utilizzare rollback nelle transazioni db
  • eccezioni personalizzati possono essere utilizzati per dare consigli su come risolvere la situazione dal gestore
  • registrare le informazioni quanto più rilevanti possibile
  • Comunicami gli sviluppatori
  • Preserve State e la coerenza dei dati quanto più è possibile

  • correzioni rapido può essere dannoso, quando il debug, meglio lasciare che il crash dell'applicazione e analizzare in dettaglio cosa è causato

+2

Se l'applicazione è importante (ad esempio il server che pilota un impianto) l'applicazione deve 1) telefonare al ragazzo che dovrà risolverlo 2) eseguire finché è sicuro di non eliminare tutto (la coerenza dei dati non può quasi mai essere compromessa). –

+3

Idealmente, l'applicazione non dovrebbe mai bloccarsi. Tuttavia, l'applicazione dovrebbe fallire con garbo quando un componente come un database o una videocamera è mancante o irraggiungibile. –

+0

Avrei pensato che per molte RuntimeException serie non avresti alcuna scelta se lasciarlo andare in crash, a meno che non si avvolga il bit di apertura del codice in un try ... catch block. –

risposta

1

Perché e quando lasciare l'arresto di un'applicazione non ha regole particolari ...... ho lasciato il mio crash dell'applicazione per le seguenti ragioni:

1. Soluzioni rapide può kick-back e sono poten rischioso. NON mi sembra corretto correggere il bug, senza sapere quale fosse la vera ragione del mio arresto del codice. Lasciando il crash dell'applicazione mi porta all'errore nel mio codice.

2. L'interruzione del codice aiuta a capire meglio il linguaggio di programmazione e gli errori logici.

Questo è il mio motivo per lasciare l'incidente app ..

2

I creatori di Java e.Net ha deciso di utilizzare il TIPO di un oggetto di eccezione lanciato per determinare quando deve essere catturato e quando dovrebbe essere considerato risolto, una decisione di progettazione probabilmente motivata dal modo in cui C++ gestisce le eccezioni. Sebbene la gestione delle eccezioni del C++ rappresentasse in molti modi un miglioramento rispetto a quanto esisteva in precedenza, il suo uso del tipo di un oggetto di eccezione come mezzo principale per determinare quali eccezioni erano state rilevate non era una delle sue migliori caratteristiche.

Poiché l'intercettazione delle eccezioni è controllata dal tipo di eccezione, non esiste un mezzo standard per l'eccezione per indicare se un'operazione non riuscita ha alterato lo stato di qualsiasi oggetto nel sistema o se l'errore è stato causato da oggetti in uno stato danneggiato (al contrario di uno stato che, sebbene possa essere inaspettato dal chiamante e non compatibile con i parametri passati, sarebbe altrimenti considerato dal metodo chiamato perfettamente legittimo). In molti casi, se in risposta a una richiesta dell'utente il sistema chiama un metodo che tenta di fare qualcosa e non può, ma il metodo non influisce negativamente sullo stato di alcun oggetto e il problema non è causato da un oggetto che ha un stato danneggiato, potrebbe spesso essere meglio informare semplicemente l'utente che l'azione richiesta non può essere eseguita e continuare. Sfortunatamente, non c'è modo di distinguere le eccezioni "innocue" dei tipi sopra indicati, da quelli che indicano problemi gravi a livello di sistema. Mentre il 99% delle eccezioni sarà probabilmente relativamente innocuo, una piccola parte sarà causata da condizioni che potrebbero causare corruzione per aprire documenti. Se un documento aperto è stato corrotto, potrebbe essere meglio per un programma arrestarsi istantaneamente in modo definitivo piuttosto che lasciarlo sostituire una buona copia su disco con quella corrotta.

Se si generano eccezioni personalizzate, è possibile includere proprietà nel tipo di eccezione che consentirebbero al codice di decidere in modo un po 'più utile cosa deve essere fatto su un'eccezione. Sfortunatamente, molte eccezioni che vengono lanciate, che siano innocue o meno, non includeranno tali proprietà.

1

Arresto anomalo dell'applicazione dipende dal livello critico dell'applicazione e dall'architettura di distribuzione.

Per un esempio, l'applicazione non deve arrestarsi in modo anomalo se controlla un razzo da terra (tranne che per situazioni non controllabili e priorità dei dati).

Quando le applicazioni sono progettate, è necessario progettarle in modo che nessun dato nei datastore venga cancellato o modificato.

Concludendo non esiste un modo semplice e veloce per stabilire le regole quando le applicazioni devono bloccarsi.

Problemi correlati