Сравнивая старый способ и новый способ обработки ошибок с использованием фильтров исключений, в чем именно для меня преимущество использования фильтров и когда мне следует его использовать? есть ли сценарий, в котором я могу получить хорошее преимущество этой новой функции?
Я читал о раскручивании стека, но до сих пор не понимаю сценария, в котором мы не можем справиться с этим по-старому. Объясните, как мне 5, пожалуйста.
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex) when (ex.Code == 42)
{
Console.WriteLine("Error 42 occurred");
}
vs
try
{
Foo.DoSomethingThatMightFail(null);
}
catch (MyException ex)
{
if (ex.Code == 42)
Console.WriteLine("Error 42 occurred");
else
throw;
}
Я знаю, что есть другая версия этого вопроса, проблема в том, что в вопросе упоминаются преимущества, которые я не могу найти, например.
Фильтры исключений предпочтительнее перехвата и повторного генерирования, потому что они не повреждают стек. Если позже исключение приведет к сбросу стека, вы сможете увидеть, откуда он исходил, а не только место, где он был переброшен в последний раз.
после некоторого тестирования я не увидел разницы между ними, я все еще вижу исключение из того места, где оно было повторно брошено. Итак, либо информация не подтверждена, либо я не разбираюсь в фильтрах исключений (поэтому и спрашиваю), либо делаю это неправильно (тоже поправьте меня, если я не прав).
class specialException : Exception
{
public DateTime sentDateTime { get; } = DateTime.Now;
public int code { get; } = 0;
public string emailsToAlert { get; } = "[email protected]";
}
тогда:
try
{
throw new specialException();
//throw new Exception("Weird exception");
//int a = Int32.Parse("fail");
}
catch (specialException e) when(e.code == 0)
{
WriteLine("E.code 0");
throw;
//throw e;
}
catch (FormatException e)
{
if (cond1)
{
WriteLine("cond1 " + e.GetBaseException().Message+" - "+e.StackTrace);
throw;
}
throw;
}
catch (Exception e) //when (cond2)
{
Console.WriteLine("cond2! " + e.Message);
throw;
}