Natknąłem się na tę nową funkcję w C #, która pozwala programowi obsługi catch na wykonanie, gdy zostanie spełniony określony warunek.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Próbuję zrozumieć, kiedy może się to kiedykolwiek przydać.
Jeden scenariusz może wyglądać mniej więcej tak:
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
}
..
ale jest to znowu coś, co mogę zrobić w ramach tego samego programu obsługi i delegować na różne metody w zależności od typu sterownika. Czy to sprawia, że kod jest łatwiejszy do zrozumienia? Prawdopodobnie nie.
Inny scenariusz, który przychodzi mi do głowy, to coś takiego:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Znowu to jest coś, co mogę zrobić:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Czy użycie funkcji „catch, when” przyspiesza obsługę wyjątków, ponieważ program obsługi jest pomijany jako taki, a rozwijanie stosu może nastąpić znacznie wcześniej niż w porównaniu z obsługą określonych przypadków użycia w ramach procedury obsługi? Czy są jakieś konkretne przypadki użycia, które lepiej pasują do tej funkcji i które ludzie mogą następnie przyjąć jako dobrą praktykę?
when
trzeba uzyskać dostęp do samego wyjątku