Повторное выбрасывание исключений в вложенных try‑catch блоках

После исправления опечаток сначала выводится TaskSchedulerException, затем IndexOutOfRangeException. throw; сохраняет исходный стек, а throw ex; переносит его начало на повторный бросок.

Короткий ответ

Что ответить на собеседовании

После исправления опечаток сначала выводится 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) печатает тип, сообщение и стек; точные тексты сообщений и номера строк зависят от среды и сборки.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее