Я натрапив на цю нову функцію в 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потрібно отримати доступ до самого винятку