Mecanismul de tratare al exceptiilor din C# permite si utilizarea exceptiilor create de programator, adica se pot defini exceptii “personalizate”, strongly typed exception, pentru cazuri specifice care pot aparea in program. In unele cazuri, este indicat ca programatorul sa construiasca propria sa exceptie care va identifica detalii unice ale problemei. Intr-un articol despre Tratarea exceptiilor in C# scriam ca o exceptie este reprezentata printr-o clasa si ca aceasta trebuie sa deriveze din clasa Exception care se afla in spatiul de nume System.
In clasele derivate din Exception se vor putea folosi sau suprascrie proprietati, metode definite in clasa de baza.
In crearea exceptiilor se recomanda :
- marcarea clasei cu atributul System.Serializable.
- definirea unui constructor implicit.
- definirea unui constructor care seteaza proprietatea mostenita Message.
- definirea unui constructor care defineste inner exceptions.
- definirea unui constructor care trateaza serializarea tipului.
[Serializable] public class MyCustomException : Exception { //additional custom properies public DateTime Date { get; set; } //defaul constructor public MyCustomException() { } //constructor that sets the inherited Message property public MyCustomException(string message, DateTime date) : base(message) { Date = date; } //constructor that handles "inner exceptions" public MyCustomException(string message, System.Exception inner) : base (message, inner) { } //constructor tha handles serialization of type protected MyCustomException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } public override string ToString() { return String.Format("Custom error message {0} at {1}", Message, Date); } }
In Visual Studio 2010 exista un snippet numit exception care va genera codul pentru o noua clasa de tip Exception.
In declararea acestor clase de exceptii strongly typed este indicata folosirea modificatorului de acces public pentru ca de multe ori exceptiile sunt transmise in afara assembly-ului si astfel vor putea fi vizibile.
Tratarea exceptiilor are ca avantaj evitarea inchiderii anormale a programului. Cand o exceptie va fi “aruncata”, ea va fi “prinsa” undeva, in cod. Daca programul nu va prinde exceptia, ea va fi manipulata de runtime care o va transforma in eroare si va inchide programul.
Crearea exceptiilor specifice reprezinta un mecanism type safe pentru aparitia unei exceptii cauzate de o anumita conditie si conduce la un mai bun control in tratarea exceptiilor. Un motiv foarte bun pentru folosirea acestora il reprezinta scrierea erorilor intr-un jurnal (logging errors).