Ich bin auf diese neue Funktion in C # gestoßen, mit der ein Catch-Handler ausgeführt werden kann, wenn eine bestimmte Bedingung erfüllt ist.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Ich versuche zu verstehen, wann dies jemals nützlich sein kann.
Ein Szenario könnte ungefähr so aussehen:
try
{
DatabaseUpdate()
}
catch (SQLException e)
when (driver == "MySQL")
{
//MySQL specific error handling and wrapping up the exception
}
catch (SQLException e)
when (driver == "Oracle")
{
//Oracle specific error handling and wrapping up of exception
}
..
Aber dies ist wieder etwas, das ich innerhalb desselben Handlers tun und je nach Treibertyp an verschiedene Methoden delegieren kann. Ist der Code dadurch leichter zu verstehen? Wohl nein.
Ein anderes Szenario, an das ich denken kann, ist so etwas wie:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Auch dies ist etwas, was ich tun kann:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Verbessert die Verwendung der Funktion "catch, when" die Ausnahmebehandlung, da der Handler als solcher übersprungen wird und das Abwickeln des Stapels viel früher erfolgen kann als bei der Behandlung der spezifischen Anwendungsfälle innerhalb des Handlers? Gibt es spezielle Anwendungsfälle, die besser zu dieser Funktion passen und die dann als bewährte Methode übernommen werden können?
try..catch...catch..catch..finally
?
catch (Exception ex)
, den Typ prüfen und throw
sonst. Etwas besser organisierter Code (auch bekannt als Vermeiden von Code-Rauschen) ist genau der Grund, warum diese Funktion vorhanden ist. (Dies gilt tatsächlich für viele Funktionen.)
when
Ausnahme selbst zugreifen muss