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