Я натрапив на цю нову функцію в 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" обробку винятків швидше, оскільки обробник пропускається як такий, і розмотування стека може відбутися набагато раніше, ніж у порівнянні з обробкою конкретних випадків використання в обробнику? Чи існують якісь конкретні випадки використання, які більше відповідають цій функції, які люди можуть потім застосувати як належну практику?
try..catch...catch..catch..finally
?
catch (Exception ex)
, перевірити тип та throw
інше. Дещо більш організований код (він же уникає шуму коду) - саме тому існує ця функція. (Це насправді справедливо для багатьох функцій.)
when
потрібно отримати доступ до самого винятку