Я столкнулся с этой новой функцией C #, которая позволяет обработчику catch выполняться при выполнении определенного условия.
int i = 0;
try
{
throw new ArgumentNullException(nameof(i));
}
catch (ArgumentNullException e)
when (i == 1)
{
Console.WriteLine("Caught Argument Null Exception");
}
Я пытаюсь понять, когда это может быть полезно.
Один сценарий может быть примерно таким:
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
}
..
но это снова то, что я могу делать в одном обработчике и делегировать разным методам в зависимости от типа драйвера. Делает ли это код более понятным? Возможно, нет.
Другой сценарий, который я могу придумать, выглядит примерно так:
try
{
SomeOperation();
}
catch(SomeException e)
when (Condition == true)
{
//some specific error handling that this layer can handle
}
catch (Exception e) //catchall
{
throw;
}
Опять же, это то, что мне нравится:
try
{
SomeOperation();
}
catch(SomeException e)
{
if (condition == true)
{
//some specific error handling that this layer can handle
}
else
throw;
}
Ускоряет ли использование функции «поймать, когда» обработку исключений, потому что обработчик пропускается как таковой, а разворачивание стека может произойти намного раньше, чем при обработке конкретных вариантов использования в обработчике? Существуют ли какие-либо конкретные варианты использования, которые лучше подходят для этой функции, которые люди могут затем принять в качестве передовой практики?
when
необходимо получить доступ к самому исключению