Я столкнулся с этой новой функцией в C#, которая позволяет обработчику уловов выполнить, когда выполняется конкретное условие.Ловля исключений с «catch, when»
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' должен получить доступ к самому исключению –
Но это то, что мы можем сделать и в самом блоке обработчика, а также правильно. Есть ли какие-либо преимущества, кроме «немного более организованного кода»? – Madhusudhan
Но тогда вы уже обработали исключение, которое вы не хотите. Что делать, если вы хотите поймать его где-нибудь еще в этом 'try..catch ... catch..catch..finally'? –