Я буду именовать блоки когда по номеру, который они выводят.
Как я понимаю, в блоке '2', мы явно не указываем тип исключения, то есть результат работы программы должен быть 1 2 3 5 6, а на самом деле имеем 1 2 3 4 6. Почему так?
Исключение из блока '1' мы уже обработали в '2', а в '2' у нас уже не NullReferenceException, а просто throw.
static void Main(string[] args)
{
try
{
try
{
System.Console.WriteLine("1");
throw new NullReferenceException();
}
catch
{
System.Console.WriteLine("2");
throw; // интересует это
}
finally
{
System.Console.WriteLine("3");
}
}
catch(NullReferenceException ex)
{
System.Console.WriteLine("4");
}
catch(Exception ex)
{
System.Console.WriteLine("5");
}
finally
{
System.Console.WriteLine("6");
}
}
Throw перебрасывает исключение, пойманное в catch так, как будто бы catch его не поймал. В вашем случае throw бросает то же исключение (тот же объект), что был пойман - т.е. брошенный выше NullReferenceException.
Продвижение своими сайтами как стратегия роста и независимости