In C# come definire le mie eccezioni?In C# come definire le mie eccezioni?
risposta
Sembra che ho iniziato un po 'di una battaglia eccezione sublcassing. In base alla guida Microsoft Best Practices che segui ... puoi ereditare da System.Exception o System.ApplicationException. C'è un post del blog buono (ma vecchio) che cerca di chiarire la confusione. Terrò il mio esempio con l'eccezione, per ora, ma si può leggere il post e ha scelto basandomi su quello che vi serve:
http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx
c'è una battaglia non di più! Grazie a Frederik per aver ricordato FxCop regola CA1058 in cui si afferma che i vostri eccezioni dovrebbero ereditare da System.Exception anziché System.ApplicationException:
CA1058: Types should not extend certain base types
Definire una nuova classe che eredita da Exception (ho incluso alcuni costruttori ... ma non deve averli):
using System;
using System.Runtime.Serialization;
[Serializable]
public class MyException : Exception
{
// Constructors
public MyException(string message)
: base(message)
{ }
// Ensure Exception is Serializable
protected MyException(SerializationInfo info, StreamingContext ctxt)
: base(info, ctxt)
{ }
}
E altrove nel codice di gettare:
throw new MyException("My message here!");
EDIT
Aggiornato con le modifiche al fine di garantire un Exception Serializable. I dettagli possono essere trovati qui:
Winterdom Blog Archive - Make Exception Classes Serializable
Prestare particolare attenzione alla sezione sui passi che devono essere prese se si aggiungono proprietà personalizzate alla classe Exception.
Grazie a Igor per avermi chiamato!
@Robin ... grazie per la modifica. Sono tornato dopo che mi sono reso conto di aver dimenticato di formattare come codice ed era già stato risolto. –
@Justin Niessner: è necessario rendere serializzabile l'eccezione personalizzata se si desidera essere in grado di lanciarlo su AppDomains –
Non è consigliabile ereditare da ApplicationException. Aumenta la gerarchia ereditaria senza una buona ragione. vedi http://blogs.msdn.com/brada/archive/2004/03/25/96251.aspx e http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx – Venr
Per definire:
public class SomeException : Exception
{
// Add your own constructors and properties here.
}
di buttare:
throw new SomeException();
grazie !!!!!!!!!!!!!!! –
Si potrebbe anche usare 'try' e' Catch SomeException(); '. Bump btw. –
Definizione:
public class CustomException : Exception
{
public CustomException(string Message) : base (Message)
{
}
}
lancio:
throw new CustomException("Custom exception message");
Linee guida per creare il proprio un'eccezione (accanto al fatto che la classe deve ereditare da eccezione)
- assicurarsi che la classe è serializzabile, aggiungendo l'attributo
[Serializable]
fornire i costruttori comuni che vengono utilizzati da eccezioni:
MyException(); MyException (string message); MyException (string message, Exception innerException);
Così, idealmente, la vostra abitudine Exception
dovrebbe cercare almeno in questo modo:
[Serializable]
public class MyException : Exception
{
public MyException()
{}
public MyException (string message)
: base(message)
{}
public MyException (string message, Exception innerException)
: base (message, innerException)
{}
}
A proposito del fatto se si dovrebbe ereditare da Exception
o ApplicationException
: FxCop ha una regola che dice che si dovrebbe evitare che eredita da ApplicationException
:
CA1058: Microsoft.Design:
Modifica la base tipo di 'MyException' in modo che non estenda più 'ApplicationException'. Questo tipo di eccezione di base non fornisce alcun valore aggiuntivo per le classi di framework . Estendere "System.Exception" o un tipo di eccezione non sealed esistente . Non creare una nuova eccezione di base a meno che non vi sia un valore specifico nell'abilitare la creazione di un gestore di catch per un'intera classe di eccezioni.
Vedere the page on MSDN in merito a questa regola.
È possibile definire la propria eccezione.
Le classi di eccezioni definite dall'utente derivano dalla classe ApplicationException.
È possibile visualizzare il seguente codice:
using System;
namespace UserDefinedException
{
class TestTemperature
{
static void Main(string[] args)
{
Temperature temp = new Temperature();
try
{
temp.showTemp();
}
catch(TempIsZeroException e)
{
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: ApplicationException
{
public TempIsZeroException(string message): base(message)
{
}
}
public class Temperature
{
int temperature = 0;
public void showTemp()
{
if(temperature == 0)
{
throw (new TempIsZeroException("Zero Temperature found"));
}
else
{
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
e per un'eccezione,
si può buttare un oggetto se è direttamente o indirettamente derivato dalla classe System.Exception
Catch(Exception e)
{
...
Throw e
}
Downvoted come raccomandato per sottoclasse Exception (not ApplicationException) dal .Net 2.0. È anche chiaramente indicato nelle altre risposte a questa stessa domanda. – Andy
- 1. Esiste questa caratteristica? Definire le mie parentesi graffe in C#
- 2. Come posso definire le mie colonne in un DataGrid WPF?
- 3. Perché Grails elimina le mie eccezioni?
- 4. Perché Akka Streams ingoia le mie eccezioni?
- 5. Dove devo definire il mio NinjectModule e le mie fabbriche?
- 6. Perché dovrei sempre rendere le mie eccezioni [serializzabili]? (NET)
- 7. Come gestire le eccezioni?
- 8. Eccezioni Java Eccezioni C++
- 9. Come definire le interfacce in C++/CLI gestito
- 10. Come mantenere le mie costanti in PHP
- 11. Come devo gestire le eccezioni in questa funzione C#?
- 12. Come gestisco le eccezioni?
- 13. Eccezioni personalizzate in C++
- 14. Come catturare le eccezioni in modo condizionale?
- 15. come definire una struttura come in C
- 16. Ottimizza le mie prestazioni
- 17. Come ignorare le eccezioni in F #
- 18. definire i propri eccezioni con costruttori di overload in scala
- 19. Come faccio a riavviare le mie scorciatoie Eclipse in Helios?
- 20. Devo firmare le mie DLL?
- 21. Utilizzo di macro in C per definire le strutture dati
- 22. Come posso definire le variabili in LINQ?
- 23. Come definire le proprietà condizionali in Maven?
- 24. Come definire le distribuzioni personalizzate in JAGS?
- 25. Leiningen: come definire le costanti in project.clj?
- 26. Come definire le callback in Android?
- 27. Come definire le subroutine "statiche" in Perl?
- 28. Come gestire le eccezioni da C++ tramite SWIG a Java
- 29. Come testare le eccezioni in laboratorio?
- 30. come gestire le eccezioni in junit
Complimenti (ma non +1) per chiedere una domanda intelligibile con il minor numero possibile di parole. –
Sono d'accordo con tutte le risposte di seguito, ma vorrei commentare che dovresti sempre ereditare direttamente da System.ApplicationException. La linea guida MS per questo è di distinguere immediatamente tra eccezioni di sistema e eccezioni definite dall'utente. Qualunque sia la tua scelta, scrivi la tua baseclass e mantieni coerente l'utilizzo delle eccezioni. –
@Joel - Attento a ciò che dici. Il documento Microsoft Best Practices si contraddice per quanto riguarda le eccezioni personalizzate. Ho cambiato la mia risposta perché l'uso dell'OP sembra più orientato verso una ApplicationException. Controlla questo post sulle contraddizioni: http://weblogs.asp.net/erobillard/archive/2004/05/10/129134.aspx –