2009-09-21 11 views
36

Mi chiedevo che tipo di eccezione dovresti lanciare per i dati mancanti. Ad esempio se un nodo xml non contiene dati. Sarebbe facile "lanciare la nuova eccezione (...)" ma questo non è raccomandato. Un'altra opzione potrebbe essere quella di creare una nuova classe di eccezioni come MissingDataException o InvalidDataException ma non esiste una classe di eccezione integrata per questo caso?Eccezione per dati mancanti

+2

Perché generare un'eccezione quando è possibile restituire il risultato della funzione che indica che alcuni dati sono mancanti? – Lightman

risposta

48

Come regola generale, controllare le eccezioni esistenti di .NET Framework per un'eccezione appropriata da lanciare prima di crearne di proprie. Per rispondere direttamente alla tua domanda, non esiste un'eccezione "dati mancanti" attualmente disponibile per il lancio, ma ciò non significa che non ci siano eccezioni adatte a coprire la tua situazione.

Nel tuo caso, l'umile InvalidOperationException può essere adatto; questa eccezione viene generata quando si chiama un metodo su un oggetto, ma lo stato dell'oggetto non è appropriato per l'operazione. Esempi di questo includono metodi di chiamata su un flusso chiuso e un enumeratore che ha superato la fine della raccolta. Se i dati XML sono lo stato interno di un oggetto e una chiamata al metodo ha rilevato i dati non validi, InvalidOperationException è un buon candidato.

Se si passano i dati XML a un metodo, uno ArgumentException o una delle sue derivate può essere una scelta appropriata. Esiste una piccola famiglia di queste eccezioni, tutte a indicare che un argomento passato a un metodo non è il metodo previsto.

Si desidera creare un'eccezione personalizzata solo quando si desidera che la circostanza eccezionale venga gestita diversamente da altre eccezioni. Se si sceglie di creare la propria eccezione, assicurarsi di derivarla da un'eccezione superiore a Exception, in modo che la natura dell'eccezione sia implicita dalla classe base.

+0

+1 Sono d'accordo al 100 percento, uso ciò che il sistema offre e solo allora se non riesci a trovare qualcosa che funzioni, allora crei eccezioni personalizzate. –

+0

Un possibile candidato sarebbe anche 'ValidationException' –

2

È possibile utilizzare System.Xml.XmlException.

Edit: Anche se System.Xml.XmlException potrebbero rientrare, penso che si dovrebbe definire la propria eccezione, come sarebbe più preciso, e si potrebbe descrivere il tipo di dati manca: un id, una data, ecc

+3

System.Xml.XmlException viene utilizzato dal runtime per indicare un errore nella lettura di un documento XML, in particolare laddove l'XML non è del formato corretto (ad esempio tag non chiuso, elemento radice mancante). Include anche numeri di linee e di caratteri. Non mi sento particolarmente adatto a me. –

+0

Se il suo XML deve avere dati in un nodo e non ce l'ha nessuno, IMO l'XML non ha il formato corretto, quindi può mostrare a quale linea (anche quale numero di caratteri se lo desidera). Penso che questo sia in forma, anche se definire la sua eccezione sarebbe meglio. –

7

Non chiamare "lanciare una nuova eccezione", perché non si sa come gestire l'eccezione.

Definire la propria eccezione. Sii più specifico, come XMLDataMissingException. Quindi puoi dare un messaggio meamingful all'utente o registrarlo.

+0

Imposta il messaggio con le specifiche. –

-5

lanciare una nuova eccezione ("il mio messaggio"); (o altro costruito in Eccezione) è spesso l'approccio corretto. L'alternativa è un'esplosione di classi Exception che possono essere utilizzate solo una volta.

Se nuove eccezioni sono giustificate, devono essere create nel contesto del dominio, non il problema.

1

Come regola generale è necessario generare eccezioni in circostanze eccezionali. Se i dati in questione influiscono negativamente sullo stato o sul comportamento dell'oggetto, genera un'eccezione personalizzata. Un approccio alternativo potrebbe comportare un qualche tipo di validatore che genera eventi che il client gestisce con garbo, ad esempio, segnala l'errore all'utente finale o inserisce valori predefiniti.

Ho avuto un problema simile a quello descritto in cui avevo 2 client (chiamiamoli A & B) leggendo e modificando un singolo file xml. Client Un nodo eliminato X, quindi il client B ha tentato di aggiornare il nodo X. Chiaramente, l'aggiornamento di un nodo che non esiste più rappresenta un problema. Per risolvere questo problema mi sono ispirato a SQL Server che riporta il numero di righe interessate da un'istruzione UPDATE.In questo caso specifico ho sollevato l'evento UpdateNode come normale con un numero di proprietà interessate dalla serie impostato su zero.

+0

Probabilmente dovresti definire cosa intendi per * eccezione personalizzata * –

12

C'è anche la classe System.Data.ObjectNotFoundException che è possibile prendere in considerazione.

+1

Quella parte fa parte di System.Data.Entity.dll e potrebbe creare una dipendenza non necessaria. – Stijn

+4

@Stijn Certo. Ecco perché ho detto "puoi prendere in considerazione". –

Problemi correlati