C#:cómo crear una excepción personalizada

C#:cómo crear una excepción personalizada

Para crear una excepción personalizada, cree una subclase de la clase Exception, como esta:

public class SimpleCustomException : Exception
{
	public SimpleCustomException(string message) : base(message) { }
	public SimpleCustomException() { }
}
Code language: C# (cs)

Luego tírelo como lo haría con cualquier otra excepción, así:

throw new SimpleCustomException("Cannot call this method on days that end with 'y'")
Code language: C# (cs)

Es una buena idea pasar un mensaje de error personalizado al constructor base. Si esta excepción no se maneja, o si está registrando la excepción, mostrará el nombre y el mensaje de la excepción, como este:

SimpleCustomException: Cannot call this method on days that end with 'y'Code language: plaintext (plaintext)

Ejemplo:lanzar una excepción personalizada cuando se pasan datos no válidos

Crear sus propias excepciones personalizadas le permite crear excepciones muy específicas. Lanzar y capturar excepciones muy específicas es parte del manejo limpio de errores.

El siguiente ejemplo muestra una clase de analizador de cadenas binarias que arroja una excepción personalizada cuando se pasan datos no válidos. Genera una excepción muy específica que explica exactamente cuál es el problema y qué datos se esperan.

1 – Agregar una clase de excepción personalizada

Esta excepción personalizada toma la cadena binaria no válida y la coloca en un mensaje de error que explica cuál es el formato esperado e incluye un ejemplo de entrada válida.

public class InvalidBinaryStringException : Exception
{
	public InvalidBinaryStringException(string binaryString)
		: base($"Bad binary string: {binaryString}. Binary string must be 0's and 1's and the length must be a multiple of 8. Example: 00000001.")
	{
	}
}
Code language: C# (cs)

2 – Lanza la excepción cuando se detectan condiciones de error

Antes de intentar analizar la cadena binaria, la clase BinaryStringUtil verifica el pasado en binaryString y lanza la InvalidBinaryStringException personalizada si la entrada no es válida.

public class BinaryStringUtil
{
	public static byte[] Parse(string binaryString)
	{
		if (binaryString.Length % 8 != 0 || Regex.IsMatch(binaryString, "[^01]"))
		{
			throw new InvalidBinaryStringException(binaryString);
		}

		//Parse binaryString into byte[]
		
		return new byte[] { };

	}
}
Code language: C# (cs)

Quizás se esté preguntando, ¿por qué no lanzar ArgumentException o FormatException en su lugar? Es cierto que podría lanzar estas excepciones y pasar el mismo mensaje de error. Sin embargo, considere las siguientes razones para usar excepciones personalizadas:

  • Usted encapsula los mensajes de error. ¿Observe cómo el código anterior simplemente pasa el binaryString a la excepción?
  • Supongamos que está utilizando una herramienta de supervisión de registros (como Splunk) y desea enviar correos electrónicos de alerta cuando se produce este error específico. Simplemente puede buscar "InvalidBinaryStringException" en el registro. Si estuviera utilizando ArgumentException, tendría que buscar el mensaje de error ("Cadena binaria incorrecta...").
  • El código del cliente puede capturar InvalidBinaryStringException y manejarlo correctamente. Digamos que su código de análisis tiene un error y algún método al que está llamando arroja ArgumentException. Si el cliente detectara esta excepción no específica, el código del cliente tendría un comportamiento de manejo de errores incorrecto y su error estaría oculto.

3:agregue pruebas unitarias para probar que el código arroja excepciones

Las siguientes pruebas unitarias parametrizadas prueban las dos condiciones de error:cuando la cadena binaria no tiene una longitud válida y cuando tiene caracteres no válidos. Tenga en cuenta que está usando Assert.ThrowsException en lugar del atributo ExpectedException.

[DataRow("01")]
[DataRow("0100000a")]
[TestMethod()]
public void ParseTest_WhenBadBinaryString_ThrowsException(string binaryString)
{
   Assert.ThrowsException<InvalidBinaryStringException>(() => BinaryStringUtil.Parse(binaryString));
}

Code language: C# (cs)