Come sapere quando utilizzare un'eccezione esistente o scrivere un eccezione personalizzata?

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

  •  13-09-2019
  •  | 
  •  

Domanda

Grazie per l'input su questa domanda , ho deciso di andare con fare il mio metodo Create () generare eccezioni in modo, come ha detto Jon Skeet, non c'è bisogno di gestirli ovunque e può semplicemente lasciare li bolla, sembra l'approccio migliore per le applicazioni di grandi dimensioni.

Così ora creare istanze di mie lezioni con questo codice:

try
{
    SmartForms smartForms = SmartForms.Create("ball");
    smartForms.Show();
}
catch (CannotInstantiateException ex)
{
    Console.WriteLine("Item could not be instantiated: {0}", ex.Message);
}

eccezione personalizzata:

using System;

namespace TestFactory234.Exceptions
{
    class CannotInstantiateException : Exception
    {

    }
}

Come faccio a sapere quale classe Exception da usare?

Nel caso di cui sopra, ho creato il mio eccezione dal momento che non so dove per ottenere un elenco di "tutte le eccezioni di sistema", o se ce n'è uno per "non essere in grado di creare un'istanza di un oggetto" ancora o se ha qualche altro significato usarlo, ecc la scelta di un tipo di eccezione per me è sempre sembra come un arbitraria di processo, in modo da creare il mio sembra essere la migliore idea in generale.

O mi manca qualcosa a proposito delle eccezioni? Quali altre implicazioni coinvolte nel decidere quale tipo di eccezione da usare?

È stato utile?

Soluzione

Se il motivo non è possibile creare l'oggetto è perché l'argomento per creare non era valido, probabilmente si dovrebbe buttare un ArgumentException. Tuttavia, si può sempre creare la nostra classe derivata da ArgumentException se si vuole veramente essere in grado di gestire questo tipo di eccezioni a parte per gli altri. (Sei sicuro di volere?)

Altri suggerimenti

perché creare eccezioni personalizzate? spiega in buona dettaglio perché e quando utilizzare il costume eccezioni.

Creare un nuovo tipo quando potrebbe essere utile per essere in grado di catturare e conoscere un determinato caso eccezionale si è verificato. E 'utile sapere che un file trovato non era, piuttosto che un'eccezione generica IO?.

ha scritto un intero post su questo argomento che si possono trovare interessanti

In sintesi, non scrivere una classe di eccezione personalizzata a meno che in realtà aspetta che qualcuno sia fermo e agire sul tipo.

Credo che un buon posto per trovare le eccezioni attualmente in vigore sia nel file di aiuto ... se si guarda l'aiuto per la classe Exception, ci dovrebbe essere un elenco di classi derivate sulla pagina di riepilogo.

Come decidere se creare una nuova (derivato da Exception), o ereditare da uno esistente dipende da ciò che significa l'eccezione.

Come dice Jon, se il codice fa alcune convalida l'argomento al metodo Create, si consiglia di fare un'eccezione derivato da ArgumentException (ad esempio forse un ArgumentNonExistentEntityException se l'ID specificato non esiste anche se questo è un po 'di la bocca piena).

Se l'eccezione si sta creando non concettualmente 'eredita' il suo significato da un'eccezione che esiste già, basta creare spudoratamente uno nuovo per la libreria.

Si creerà un tipo di eccezione personalizzata per fornire maggiori informazioni contestuali o significato per l'errore altrimenti si basano sul runtime generato tipi di eccezione. Per esempio un'eccezione come eccezione System.DivideByZero non può essere evidente quando bolle fino alla cima in un'applicazione. Invece, è possibile creare un'eccezione personalizzata per fornire ulteriori informazioni contestuali in aggiunta a l'errore precedente 'DivideByZero'.

Per riferimento alle eccezioni di diverso runtime generati, si prega di dare un'occhiata al namespace System di MSDN. Questo non è un elenco esaustivo poiché eccezioni possono essere generati da codice nativo e anche da librerie di terze parti.

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