Eccezioni: cosa gestire, cosa gettare [chiuso]

0

Ho un lettore di configurazione personalizzato che svolge varie funzioni su .NET CloudConfigurationManager e ConfigurationManager implementazioni, come la memorizzazione nella cache, la conversione del tipo, ecc.

Il seguente metodo viene utilizzato per recuperare un elemento di configurazione:

public T GetSetting<T>(string key)
{
    string value = GetSetting(key);

    return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
}

Ci sono alcuni punti di errore per i quali voglio aggiungere la gestione delle eccezioni corretta.

GetSetting<T> con gestione delle eccezioni:

public T GetSetting<T>(string key)
{
    // If the key is null or empty
    if (String.IsNullOrWhiteSpace(key))
    {
        throw new ArgumentNullException(String.Format("Configuration value with key '{0}' cannot be null or empty", key));
    }

    string value = GetSetting(key);

    // If the value does not exist in the underlying configs
    if(value == null)
    {
        throw new ArgumentOutOfRangeExcetion(String.Format("Configuration value with key '{0}' does not exist", key));
    }

    try
    {
        return (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
    }
    catch(InvalidCastException ex)
    {
        throw new ArgumentOutOfRangeException(String.Format("Configuration value with key '{0}' could not be converted: Conversion not supported.", key), ex);
    }
    catch (FormatException ex)
    {
        throw new ArgumentOutOfRangeException(String.Format("Configuration value with key '{0}' could not be converted: Format error.", key), ex);
    }
}

Le mie domande e i miei dubbi:

Se la chiave è null o vuota:

È accettabile lanciare un ArgumentNullException quando il parametro stringa non è solo nullo, ma anche vuoto? Forse un ArgumentException è migliore in quanto si tratta di un problema più generale rispetto al controllo di null .

Se il valore non esiste nelle configurazioni di base:

Un ArgumentOutOfRangeException viene generalmente utilizzato per un indice che non esiste nella raccolta basata su elenchi o dizionari. Si applica qui? Le configurazioni sono essenzialmente dizionari di coppie chiave valore.

L'idea è che il metodo può solo restituire null, ma per questo motivo ho fornito un metodo HasSetting(string) . Secondo me, più è esplicito, meglio è. Il controllo di null nel codice client richiede la comprensione implicita della funzionalità incapsulata, che può essere spesso utilizzata in modo errato, travisata e fraintesa.

Se l'analisi di T non riesce per qualsiasi motivo:

Questo è il difficile. Qual è il miglior tipo di eccezione per incapsulare le eccezioni di "conversione"? Devo lasciare che le eccezioni sottostanti da Convert.ChangeType() siano esplosive?

% eccezione di overflow diConvert.ChangeType():

Non vedo alcun motivo per gestire il OverflowException in Convert.ChangeType() . Lascerò solo questo tiro.

Per ragioni di riferimento, queste sono le eccezioni generate da Convert.ChangeType() :

// Exceptions:
//   System.InvalidCastException:
//     This conversion is not supported. -or-value is null and conversionType is
//     a value type.-or-value does not implement the System.IConvertible interface.
//
//   System.FormatException:
//     value is not in a format for conversionType recognized by provider.
//
//   System.OverflowException:
//     value represents a number that is out of the range of conversionType.
//
//   System.ArgumentNullException:
//     conversionType is null.
    
posta davenewza 10.10.2014 - 09:51
fonte

1 risposta

2

Is it acceptable to throw an ArgumentNullException when the string parameter is not only null, but also empty? Perhaps a ArgumentException is better as this is more general issue than just null checking.

Sì, penso che ArgumentException si adatti meglio qui. Immagino che la soluzione "corretta" sarebbe quella di gettare ArgumentNullException per null e ArgumentException per vuoto, ma non penso che ne valga la pena.

An ArgumentOutOfRangeException is generally used for a index which doesn't exist in list- or dictionary-based collection. Does it apply here? The configs are essentially key value pair dictionaries.

ArgumentOutOfRangeException non viene utilizzato per i dizionari. Ad esempio, l'indicizzatore di Dictionary genera KeyNotFoundException . Penso che dovresti usarlo, soprattutto dal momento che in questo caso non hai alcun intervallo.

An idea is that the method can just return null, but I have provided a HasSetting(string) method for this reason.

La configurazione può cambiare tra la chiamata a HasSetting() e GetSetting() ? Se è possibile, considera l'aggiunta di qualcosa come bool TryGetSetting<T>(string key, out T item) , in modo che un elemento che potrebbe non essere presente possa essere recuperato in modo sicuro senza la gestione delle eccezioni.

Ma sono d'accordo sul fatto che il controllo di null non sia di solito una buona idea.

If parsing to T fails for whatever reason

ArgumentOutOfRangeException è ancora meno appropriato qui. Se non trovi alcuna eccezione incorporata adatta, crea una classe di eccezioni personalizzata e lanciala.

    
risposta data 10.10.2014 - 16:09
fonte

Leggi altre domande sui tag