C# – So erstellen Sie eine benutzerdefinierte Ausnahme

C# – So erstellen Sie eine benutzerdefinierte Ausnahme

Um eine benutzerdefinierte Ausnahme zu erstellen, erstellen Sie eine Unterklasse der Ausnahmeklasse wie folgt:

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

Dann werfen Sie es wie jede andere Ausnahme, etwa so:

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

Es ist eine gute Idee, eine benutzerdefinierte Fehlermeldung an den Basiskonstruktor zu übergeben. Wenn diese Ausnahme nicht behandelt wird oder wenn Sie die Ausnahme protokollieren, werden Name und Meldung der Ausnahme wie folgt angezeigt:

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

Beispiel – Auslösen einer benutzerdefinierten Ausnahme, wenn ungültige Daten übergeben werden

Durch das Erstellen eigener benutzerdefinierter Ausnahmen können Sie sehr spezifische Ausnahmen erstellen. Das Werfen und Abfangen sehr spezifischer Ausnahmen ist Teil einer sauberen Fehlerbehandlung.

Das folgende Beispiel zeigt eine binäre String-Parser-Klasse, die eine benutzerdefinierte Ausnahme auslöst, wenn ungültige Daten übergeben werden. Sie löst eine sehr spezifische Ausnahme aus, die genau erklärt, was das Problem ist und welche Daten erwartet werden.

1 – Fügen Sie eine benutzerdefinierte Ausnahmeklasse hinzu

Diese benutzerdefinierte Ausnahme nimmt den ungültigen BinaryString und fügt ihn in eine Fehlermeldung ein, die das erwartete Format erklärt und ein Beispiel für eine gültige Eingabe enthält.

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 – Auslösen der Ausnahme, wenn Fehlerbedingungen erkannt werden

Bevor versucht wird, den binären String zu parsen, prüft die BinaryStringUtil-Klasse den übergebenen BinaryString und löst die benutzerdefinierte InvalidBinaryStringException aus, wenn die Eingabe ungültig ist.

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)

Sie fragen sich vielleicht, warum nicht stattdessen ArgumentException oder FormatException ausgelöst werden? Richtig, Sie könnten diese Ausnahmen auslösen und dieselbe Fehlermeldung übergeben. Beachten Sie jedoch die folgenden Gründe für die Verwendung benutzerdefinierter Ausnahmen:

  • Sie kapseln Fehlermeldungen ein. Beachten Sie, wie der obige Code einfach den BinaryString an die Ausnahme übergibt?
  • Nehmen wir an, Sie verwenden ein Protokollüberwachungstool (wie Splunk) und möchten Warn-E-Mails senden, wenn dieser spezielle Fehler auftritt. Sie können einfach im Protokoll nach „InvalidBinaryStringException“ suchen. Wenn Sie ArgumentException verwenden, müssten Sie stattdessen nach der Fehlermeldung suchen („Bad Binary String…“).
  • Der Client-Code kann InvalidBinaryStringException abfangen und ordnungsgemäß verarbeiten. Nehmen wir an, Ihr Parsing-Code hat einen Fehler und eine Methode, die Sie aufrufen, löst ArgumentException aus. Wenn der Client diese unspezifische Ausnahme abfangen würde, hätte der Client-Code das falsche Fehlerbehandlungsverhalten und Ihr Fehler wäre verborgen.

3 – Fügen Sie Komponententests hinzu, um zu beweisen, dass der Code Ausnahmen auslöst

Die folgenden parametrisierten Komponententests testen die beiden Fehlerbedingungen:wenn die binäre Zeichenfolge keine gültige Länge hat und wenn sie ungültige Zeichen enthält. Beachten Sie, dass Assert.ThrowsException anstelle des Attributs „ExpectedException“ verwendet wird.

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

Code language: C# (cs)