Saltar al contenido

Comprensión, definición y uso de las excepciones personalizadas

…NET proporciona clases de excepción incorporadas que podemos lanzar cuando la regla de negocios de nuestra aplicación es violada. Sin embargo, si ninguno de estos tipos de excepción incorporados satisface nuestras necesidades, podemos crear nuestras propias clases de excepción. Las clases de excepción que definimos en nuestros proyectos son lo que se conoce como excepciones personalizadas . Puede definir y usar excepciones personalizadas si'está construyendo una biblioteca o un marco de trabajo, y quiere que los consumidores de esa biblioteca reaccionen a las excepciones de la biblioteca de forma diferente a como lo harían con los tipos de excepción incorporados. Otro escenario útil es si usted'rea una interfaz con algún servicio externo que devuelva códigos de error para indicar los errores. Entonces puedes tener una forma de traducir los códigos de error en excepciones personalizadas usando algo como los patrones de diseño de la Pasarela o la Fachada.

Al implementar las clases de excepción personalizadas, deben heredar de la clase System.Exception (o de cualquiera de sus otras clases de excepción personalizadas). El nombre de la clase debe terminar con la palabra Excepción y debe implementar al menos los tres constructores comunes de tipos de excepción.

Comprensión, definición y uso de las excepciones personalizadas
Comprensión, definición y uso de las excepciones personalizadas

Veamos un ejemplo de aplicación que debería ser capaz de transferir fondos entre dos cuentas. La regla de negocios es que no se puede acreditar o debitar una cuenta que está bloqueada, y aquí es donde tiraremos la excepción personalizada. Crear un nuevo proyecto de aplicación de consola. Añadir un archivo AccountBlockedException.cs con la siguiente definición de clase:

<pre>123456789101112131415161718192021222324252627282930313233343536373839404142[Sistema.Serializable]public classAccountBlockedException:System. Excepción{privatestaticreadonlystring DefaultMessage ="La transacción no puede realizarse en una cuenta bloqueada";publicstring AccountName {get;set;}publicstring TransactionType {get;set;}publicAccountBlockedException():base(DefaultMessage){}publicAccountBlockedException(string message):base(message){}publicAccountBlockedException(string message,System. Excepción innerException):base(mensaje, innerException){}publicAccountBlockedException(string accountName,string transactionType):base(DefaultMessage){ AccountName = accountName; TransactionType = transactionType;}publicAccountBlockedException(string accountName,string transactionType,System. Excepción innerException):base(DefaultMessage, innerException){ AccountName = accountName; TransactionType = transactionType;}publicAccountBlockedException(string accountName,string transactionType,string message):base(message){ AccountName = accountName; TransactionType = transactionType;}publicAccountBlockedException(string accountName,string transactionType,string message,System. Excepción innerException):base(mensaje, innerException){ AccountName = accountName; TransactionType = transactionType;}protectedAccountBlockedException(System.Runtime.Serialization.SerializationInfo,System.Runtime.Serialization.StreamingContext):base(info, context){}}</pre>
csharp

Definimos una excepción personalizada llamada AccountBlockedException que deriva de la clase System.Exception base. Contiene las propiedades TransactionType y AccountName, y una variable de mensaje por defecto que se establecerá como la propiedad Message cuando no se suministre ningún argumento de mensaje desde el constructor. Los tres primeros constructores públicos son los tres constructores estándar para los tipos de excepción. Los demás constructores aceptan los argumentos accountName para indicar el propietario de la cuenta y transactionType para especificar si fue una transacción de crédito o débito la que causó el error.