2009-06-22 4 views
5

Immaginate di avere un metodo con la seguente firma:Qualora Guid.Empty Risultato in ArgumentException o ArgumentOutOfRangeException

public void DoSomething(Guid id) 

Se Guid.Emtpy rappresenta un valore non valido, quale tipo di eccezione sarebbe più appropriato per buttare? ArgumentException o ArgumentOutOfRangeException?

sto leggermente inclinato verso ArgumentException, dal momento che non credo che tutti i GUID tranne Guid.Empty è molto più di una gamma - è un po 'troppo inclusiva: C'è un solo membro escluso.

Tuttavia, non sono in alcun modo determinato che questo dovrebbe essere il caso, quindi mi piacerebbe sapere se qualcuno può fornire argomenti per uno o l'altro?

Sono ben consapevole del fatto che si tratta principalmente di una discussione semantica, ma nell'interesse della buona progettazione dell'API mi piacerebbe comunque sapere se vi sono casi chiari per l'una o l'altra opzione.

+0

È quasi come se il metodo avesse bisogno di una buona Guida. –

+0

Forse definisci la tua ArgumentEmptyException? – yfeldblum

+0

@Justice. Non è consigliabile aggiungere un nuovo tipo di eccezione per uno scenario in cui non si desidera prenderlo. Mark dovrebbe semplicemente lanciare uno dei tipi di eccezione esistenti. – Steven

risposta

5

Dire che un valore vuoto è fuori portata, sembra solo sbagliato. Siccome Guid.Empty viene solitamente utilizzato quando non esiste alcun valore definito, non esiste alcun valore che possa essere al di fuori dell'intervallo.

La situazione è simile a quando si utilizza ArgumentNullException, tranne che non esiste un'eccezione specifica per valori vuoti. Un ArgumentNullException sarebbe fuorviante, quindi ArgumentException è una soluzione migliore.

Considerare anche se ApplicationException sarebbe migliore. Questo è usato per le eccezioni nell'applicazione piuttosto che in una libreria di classi.

+1

ApplicationException è un po 'ridondante e probabilmente meglio evitato (http://stackoverflow.com/questions/52753/derive-from- eccezione-o-ApplicationException-in-net). – adrianbanks

+0

@adrianbansk: Si tratta di derivare dalle classi Exception, che sono solo a malapena correlate. Se non si desidera utilizzare un'eccezione di sistema specifica in modo da poterla intercettare insieme ad altre eccezioni di sistema, un'eccezione ApplicationException funziona correttamente. – Guffa

+1

Sì, lo so. Quello che stavo ottenendo è che se ApplicationException viene considerato come "non dovrebbe far parte di .Net Framework" da molti, allora il suo uso potrebbe essere deprecato in futuro. Evitare ora il suo uso per ArgumentException più rilevanti potrebbe evitare questo problema in seguito. – adrianbanks

1

Throw an Invalid ArgumentException. Questo segue esattamente la semantica che stai cercando. Se non prevedi uno uint e non tutti i valori eccetto lo 0xffffffff sono validi, non varrebbe uno ArgumentOutOfRangeException?

+3

InvalidArgumentException fa parte dello spazio dei nomi Microsoft.SqlServer.Management.Common. Non si vorrebbe aggiungere un riferimento solo per ottenere l'accesso a tale eccezione. Utilizzare invece ArgumentException, che si trova nello spazio dei nomi System. – Guffa

+0

Hai assolutamente ragione. Potrei giurare che ho visto alcuni InvalidArgumentException nel codice BCL, poiché non ho mai usato SqlServer ... – OregonGhost

7

Vorrei buttare un ArgumentException. Il suo docs dire:

L'eccezione che viene generata quando uno degli argomenti forniti a un metodo non è valido.

che è esattamente lo scenario che descrivi. Volete qualcosa sulla falsariga di:

throw new ArgumentException("Guid.Empty is not a valid id", "id");
0

AE.

Esattamente qual è la gamma accettabile di Guids che il metodo si aspetta?

È CA72EE5A-5F26-11DE-BD28-13A156D89593 entro l'intervallo accettabile, ma D58B3112-5F26-11DE-B0D2-5FA156D89593 è uscito correttamente?

+0

Penso che il range accettabile sia 00000000-0000-0000-0000-000000000001 in FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF. Pertanto, penso che possiamo concludere che Mark dovrebbe lanciare un ArgumentOutOfRangeException, perché c'è solo un singolo valore che non è valido. Dovrebbe lanciare un'eccezione InvalidSingleArgumentValueException, ma poiché questa eccezione non esiste, andrei per ArgumentException :-) – Steven