Domanda

C'è un motivo perché FormatException non si eredita da ArgumentException?Un formato non valido sembrerebbe essere un caso molto specifico di un argomento non valido, simile a ArgumentOutOfRangeException.

Il Articolo di MSDN per la classe membri:

FormatException viene generata quando il formato di un argomento in una invocazione di metodo non corrisponde al formato del corrispondente parametro formale di tipo.Per esempio, se un metodo specifica String parametro costituito da due cifre con un embedded periodo, il superamento di un corrispondente argomento stringa contenente solo due cifre a tale metodo potrebbe causare FormatException per essere gettato.

Suona come solo lo scenario per un ArgumentException o derivanti classe per me.

Tutto questo significa che non si può risolvere FormatException sotto il più grande ArgumentException eccezione famiglia, né è possibile identificare quale è il parametro che ha causato l'eccezione.

C'è un motivo per questa apparentemente fuori luogo eccezione da dove viene?

È stato utile?

Soluzione

FormatException non è necessariamente generata quando un argomento formale di un metodo non è valido. Può anche accadere se il metodo sta consumando una risorsa esterna e il formato dei dati dalla risorsa esterna non è appropriato.

Per esempio, BinaryReader.Read7BitEncodedInt getteranno FormatException se quello che sta andando a leggere da un flusso non è un numero intero codificato a 7 bit valido. Non ci vuole alcun argomento a tutti. ArgumentException, d'altra parte, dovrebbe avere gettato solo quando un argomento passato come parametro formale a un metodo non è valido.

La descrizione si fa riferimento alle voci di MSDN è più restrittivo FormatException è realmente e dovrebbe essere chiarito.

Altri suggerimenti

Questo è un po ' arrogante:ma Richter CLR Via C# (pagina 432) suggerisce che forse è perchè Eccezione gerarchia di classe non sia stato implementato molto bene .NET:

Microsoft idea originale era che System.Exception sarebbe il tipo di base per tutte le eccezioni e che altri due tipi, System.SystemException e System.ApplicationException due tipi immediatamente derivato da Exception.Inoltre, le eccezioni generate dal CLR sarebbe derivato da SystemException, e tutte le applicazione generata eccezioni sarebbero derivati da ApplicationException.In questo modo, gli sviluppatori possono scrivere un blocco catch che cattura tutti di applicazione generata eccezioni.

Tuttavia, ...questa regola non è stata seguita molto bene;alcune eccezioni sono immediati derivati da Exception (IsolatedStorageException), alcuni CLR generata eccezioni sono derivati forma ApplicationException...Quindi è tutto un gran casino, e il risultato è che il SystemException e ApplicationException tipi non hanno un particolare significato.A questo punto, Microsoft vorrebbe rimuovere dalla classe exception gerarchia, ma non possono perché sarebbe rompere il codice che già fa riferimento a questi tipi di.

Questa non è proprio una risposta alla tua domanda, ma penso che sia rilevante, perché penso che indica che non c'è davvero una buona ragione per cui alcuni eccezione derivati ereditare il modo in cui lo fanno.Purtroppo, l'Eccezione di ereditarietà di classe non era poi così ben pensato e che è una sorta di pasticcio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top