Ловля исключений с помощью «поймать, когда»
Я столкнулся с этой новой функцией в 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;
}
Делает ли использование функции «catch, when» обработку исключений быстрее, потому что обработчик пропускается как таковой, и раскрутка стека может произойти намного раньше, чем по сравнению с обработкой конкретных случаев использования внутри обработчика? Существуют ли какие-либо конкретные варианты использования, которые лучше соответствуют этой функции, которые люди могут использовать в качестве хорошей практики?