После исправления опечаток сначала выводится TaskSchedulerException, затем IndexOutOfRangeException. throw; сохраняет исходный стек, а throw ex; переносит его начало на повторный бросок.
Повторное выбрасывание исключений в вложенных try‑catch блоках
После исправления опечаток сначала выводится TaskSchedulerException, затем IndexOutOfRangeException. throw; сохраняет исходный стек, а throw ex; переносит его начало на повторный бросок.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется программа на C#, в которой два вложенных блока try‑catch пере‑выбрасывают исключения разными способами. Необходимо объяснить порядок выполнения и показать, какие сообщения будут выведены.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;Threading.Tasks;
namespace TestProj
{
static class Program{
static void Main(string[] args){
try {
try {
throw new System.Threading.Tasks.TaskSchedulerException();
} catch {
throw ;
}
}
catch (Exception ex) {
Console.WriteLine(ex);
}
try{
try {
throw new IndexOutofRangeException();
}
catch (Exception ex)
{
throw ex;
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
Ответ
После исправления опечаток сначала выводится TaskSchedulerException, затем IndexOutOfRangeException. throw; сохраняет исходный стек, а throw ex; переносит его начало на повторный бросок.
В директиве using нужно заменить System;Threading.Tasks на System.Threading.Tasks, а тип IndexOutofRangeException исправить на IndexOutOfRangeException с заглавной O.
Первый внутренний catch перебрасывает текущее исключение без изменения точки происхождения. Внешний catch печатает его и разрешает перейти ко второму try. Второй внутренний catch использует throw ex, поэтому стек уже указывает на место повторного броска. Console.WriteLine(ex) печатает тип, сообщение и стек; точные тексты сообщений и номера строк зависят от среды и сборки.