Qual è la corretta .NET eccezione per lanciare quando si tenta di inserire un oggetto duplicato in una collezione?

StackOverflow https://stackoverflow.com/questions/54789

  •  09-06-2019
  •  | 
  •  

Domanda

Ho un Asset oggetto che ha una proprietà AssignedSoftware, che è una raccolta.

Voglio fare in modo che lo stesso pezzo di Software non è assegnato a un Bene più di una volta.Nel metodo Add posso controllare per vedere se il Software esiste già, e se lo fa, voglio lanciare un'eccezione.

C'è uno standard .NET eccezione che dovrei buttare?O non le migliori pratiche dettare ho creato il mio eccezione personalizzata?

È stato utile?

Soluzione

Dalla Libreria di classi linee guida per la progettazione errori (http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

Nella maggior parte dei casi, utilizzare i tipi di eccezione predefiniti.Solo definire nuovi tipi di eccezioni per scenari programmatici, dove si prevede che gli utenti della libreria di classi per la cattura di eccezioni di questo nuovo tipo e di eseguire un programmatica azione in base al tipo di eccezione in sé.Questo è invece l'analisi di eccezione stringa, che avrebbe effetti negativi sulle prestazioni e manutenzione.

...

ArgumentException o creare un'eccezione derivato da questa classe se i parametri non validi sono passati o rilevato.

Lanciare l'eccezione InvalidOperationException se una chiamata a un insieme di proprietà della funzione di accesso o metodo non è appropriato dato lo stato corrente dell'oggetto.

Questo mi sembra un "stato dell'Oggetto non valido" scenario di me, quindi mi piacerebbe scegliere InvalidOperationException oltre ArgumentException:I parametri sono validi, ma non fino a questo punto in oggetti di vita.

Altri suggerimenti

Perché ha InvalidOperationException stata accettata come risposta?!Dovrebbe essere un ArgumentException?!

InvalidOperationException deve essere utilizzato se l'oggetto con il metodo/proprietà denominata contro di essa non è in grado di far fronte con la richiesta a causa di uninit autenticata di stato etc.Il problema qui è non è l'oggetto che viene Aggiunto, ma l'oggetto viene passato l'oggetto (è un dupe). Pensateci, se a questo Aggiungi chiamata non è mai avvenuto, sarebbe l'oggetto ancora in funzione come normale, SÌ!

Questo dovrebbe essere un ArgumentException.

.Net genererà un Sistema.ArgumentException se si tenta di aggiungere un elemento a una hashtable due volte con lo stesso valore di chiave, in modo che doesnt sembrare non c'è nulla di più specifico.Puoi scrivere la tua eccezione se avete bisogno di qualcosa di più specifico.

Probabilmente si dovrebbe buttare ArgumentException, come quello è che cosa la base della libreria di classi.

Beh, se si vuole veramente una collezione di oggetti unici, si potrebbe desiderare di dare un'occhiata al Oggetto HashSet (disponibile in C# 3.0).

In caso contrario, ci sono due approcci che si possono adottare:

  • Creare un'eccezione personalizzata per la tua attività, proprio come aveva dichiarato
  • Implementare un metodo Add() che restituisce un valore booleano:true se l'elemento è stato aggiunto e false se la voce è già un duplicato della collezione

Entrambi gli approcci possono essere considerati i migliori prassi, così come lungo come si sono coerente nel suo utilizzo.

Mi è sempre piaciuto il InvalidOperationException.Tuttavia, si potrebbe anche creare un'eccezione personalizzata, dire una DuplicateSoftwareAssignmentException.


Dal quadro di riferimento linee guida per la progettazione:

"ArgumentException o creare un'eccezione derivato da questa classe se i parametri non validi sono passati o rilevato.

Gettare il InvalidOperationException eccezione in caso di una chiamata a un insieme di proprietà funzione di accesso o metodo non è appropriato dato lo stato corrente dell'oggetto."

Lo stato attuale include riferimenti ad altre istanze di classe.In questo caso, lo stato già include un riferimento all'istanza di essere aggiunto, pertanto, la chiamata al metodo è inadeguato.

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