Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297

Как обработать исключение в блоке catch

16.08.2019, 03:22. Показов 4488. Ответов 18

Студворк — интернет-сервис помощи студентам
Есть такой несложный код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
 
namespace TestApp
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new MyException();
            }
            catch (MyException e)
            {
                Console.WriteLine("MyException");
                throw new MyException1();
            }
            catch (MyException1 e)
            {
                Console.WriteLine("MyException1");
            }
            finally
            {
                Console.WriteLine("Finally");
                Console.ReadLine();
            }
        }
    }
 
    class MyException : Exception
    {
 
    }
 
    class MyException1 : Exception
    {
 
    }
}
Ожидал, что после выбрасывания исключения в первом блоке catch выполнится блок finally, но он не выполняется. Почему так, ведь, вроде бы, блок finally должен выполняться всегда? И как быть в подобной ситуации, как справиться с исключением в блоке catch?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2019, 03:22
Ответы с готовыми решениями:

Как найти идентификатор ошибки в блоке Try Catch?
Текстовое описание ошибки легко получить: MsgBox(ex.Message) а как узнать номер ошибки? Ведь в блоке Try Catch мы попадаем в секцию ...

Как вывести сообщение об ошибке в блоке Try Catch
Привет. Сохраняю файл Visio: dim name as string="C: тут весь путь" if name<>"" then try ...

Как не делать остановку в блоке try/catch при дебаге?
Всем привет. Делаю дебаг кода. Но есть функция с блоком try/catch на котором постоянно происходит остановка. Так вот : как мне не...

18
.NET
133 / 91 / 44
Регистрация: 17.08.2015
Сообщений: 296
16.08.2019, 09:19
Цитата Сообщение от Abejon Посмотреть сообщение
Есть такой несложный код:
А собственно для чего тут два блока catch? Если будет только один блок catch то Finally выполняется без проблем
Тоже интересно почему
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
16.08.2019, 09:25
покажите что выводит в консоли!
По вашему коду должен выводить:
Code
1
2
3
MyException
MyException1
Finally
0
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
16.08.2019, 10:24  [ТС]
Два блока catch исключительно для проведения эксперимента: что будет если в блоке catch в свою очередь будет выброшено исключение.

Добавлено через 2 минуты
Вот! И этого ожидал, но выводится только "MyException", а потом приложение падает.
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
16.08.2019, 10:26
Вы вызываете исключение в своём же первом кетче и никак его не отлавливаете, соответственно ни о какой Финале и речи быть не может

Добавлено через 1 минуту
Если вы хотите отлавливать исключения внутри кетча, вам придётся писать вложенную конструкцию трай уже в него
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
16.08.2019, 10:27
Abejon, проверьте внимательнее вывод у Вас будет:
MyException
Необработанное исключение с вытекающими последствиями
Finally

Заметьте вывода MyException1 не будет!!!
Миниатюры
Как обработать исключение в блоке catch  
0
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
16.08.2019, 10:48  [ТС]
У меня не выводится "Finally" - программа вываливается. Что-то не так настроено?

Добавлено через 2 минуты
Вы вызываете исключение в своём же первом кетче и никак его не отлавливаете, соответственно ни о какой Финале и речи быть не может

Добавлено через 1 минуту
Если вы хотите отлавливать исключения внутри кетча, вам придётся писать вложенную конструкцию трай уже в него
Ради этого, собственно, и эксперимент. А если в нём - вложенном блоке - возникнет исключение?
Получается, что нет возможности гарантированно обработать исключения?
0
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
16.08.2019, 10:50
Цитата Сообщение от Abejon Посмотреть сообщение
Получается, что нет возможности гарантированно обработать исключения?
опять таки делать обертку тру кетч...
0
3 / 2 / 2
Регистрация: 21.03.2017
Сообщений: 297
16.08.2019, 10:52  [ТС]
опять таки делать обертку тру кетч...
И так до бесконечности? :-)
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
16.08.2019, 10:53
Лучший ответ Сообщение было отмечено Abejon как решение

Решение

Цитата Сообщение от Abejon Посмотреть сообщение
А если в нём - вложенном блоке - возникнет исключение?
Получается, что нет возможности гарантированно обработать исключения?
Отчего же? Обычно в блоке кетч просто выводится сообщение о произошедшей ошибке, записываются данные в ЛОГ или отменяются действия, которые успели произойти до возникновения исключения.
Если эта отмена потенциально может вызвать свои исключения, тогда внутри кетча просто пишется ещё один трай и там уже отлавливается это самое новое исключение. Ваша же конструкция отлавливает просто два вида исключений, но только тех, что произойдут внутри блока трай, то есть либо то либо другое. Одновременно два не смогут произойти, так как сразу после первого выполнение дальнейшего кода прерывается.
1
 Аватар для V_Monomax
1406 / 1260 / 20
Регистрация: 09.08.2011
Сообщений: 2,319
Записей в блоге: 1
16.08.2019, 10:58
Цитата Сообщение от Abejon Посмотреть сообщение
И так до бесконечности? :-)
при нормальном написании кода, обычно хватает одной, максимум две.
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
16.08.2019, 11:05
Цитата Сообщение от Abejon Посмотреть сообщение
вроде бы, блок finally должен выполняться всегда?
Это неправда.
В случае гарантированного завершения программы при необработанном исключении блок finally НЕ выполняется.

Я со своим преподавателем специально тестировал данную ситуацию.

А вот так при обработанном исключении оба finally выполняются:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        static void Main(string[] args)
        {
            try
            {
                try
                {
                    throw new MyException();
                }
                catch (MyException e)
                {
                    Console.WriteLine("MyException");
                    throw new MyException1();
                }
                catch (MyException1 e)
                {
                    Console.WriteLine("MyException1");
                }
                finally
                {
                    Console.WriteLine("Finally");
                }
            }
            catch(Exception e)
            {
                Console.WriteLine("Outer catch");
            }
 
            finally
            {
                Console.WriteLine("Outer finally");
            }
            Console.ReadLine();
        }
0
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
16.08.2019, 11:18
Abejon,
Цитата Сообщение от Abejon Посмотреть сообщение
Получается, что нет возможности гарантированно обработать исключения?
для этого придумали разные типы Exception https://metanit.com/sharp/tutorial/2.29.php какой смысл обрабатывать исключения внутри исключений? для этого и придумали finally - если в блоке try произошло исключение, начинается поиск известных в блоках catch, если не нашло ни одного из известных, то выполняется блок finally.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.08.2019, 11:26
Не хочу комментировать все глупости здесь написанные.
Просто запустите приложение с перенаправлением вывода в файл (TestApp.exe > output.txt) и гляньте результат.
Вывод конечно же содержит Finally.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
16.08.2019, 11:49
Abejon, nicolas2008, в официальной документации:
https://docs.microsoft.com/ru-... ry-finally
Внутри обработанного исключения гарантируется выполнение связанного блока finally. Однако если исключение не обработано, то выполнение блока finally зависит от того, как запускается операция развертывания исключения. Это, в свою очередь, зависит от способа настройки компьютера.
То есть блок finally НЕ обязан выполняться.
За поведение размотки стека в отладчике отвечает вот эта настройка:
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
16.08.2019, 12:07
Вот интересный способ "гарантировать" выполнение блока finally - поместить "рабочий код" в Task. Тогда в точку await гарантированно пробросится исключение, если мы правильно реализовали Task Asynchronous Pattern:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
        public static Task RunSynchronously(Action action)
        {
            var tcs = new TaskCompletionSource<bool>();
 
            try
            {
                action();
                tcs.SetResult(true);
            }
            catch (Exception e)
            {
                tcs.SetException(e);
            }
            return tcs.Task;
        }
 
        static void Main(string[] args)
        {
            void action()
            {
                try
                {
                    throw new MyException();
                }
                catch (MyException e)
                {
                    Console.WriteLine("MyException");
                    throw new MyException1();
                }
                catch (MyException1 e)
                {
                    Console.WriteLine("MyException1");
                }
                finally
                {
                    Console.WriteLine("Finally");
                }
            }
 
            //try
            //{
            RunSynchronously(action).GetAwaiter().GetResult();
            //}
            //catch (Exception e)
            //{
            //    Console.WriteLine("Outer catch");
            //}
 
            //finally
            //{
            //    Console.WriteLine("Outer finally");
            //}
            Console.ReadLine();
        }
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.08.2019, 12:24
Цитата Сообщение от amr-now Посмотреть сообщение
То есть блок finally НЕ обязан выполняться.
Не "не обязан" а зависит от настройки CLR. По умолчанию таки ВЫПОЛНЯЕТСЯ.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
16.08.2019, 12:26
Цитата Сообщение от nicolas2008 Посмотреть сообщение
По умолчанию таки ВЫПОЛНЯЕТСЯ.
Это сейчас в текущей версии VS. А мы с преподавателем на разных компьютерах в VS2015 в C# 6 одинаково заметили, что по умолчанию не выполняется.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
16.08.2019, 12:45
Цитата Сообщение от amr-now Посмотреть сообщение
Это сейчас в текущей версии VS. А мы с преподавателем на разных компьютерах в VS2015 в C# 6 одинаково заметили, что по умолчанию не выполняется.
Я говорю о запуске без отладчика VS.
Поверь, когда задают такие вопросы, мало кого интересует как это будет работать в отладчике. Главное как это будет работать на проде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2019, 12:45
Помогаю со студенческими работами здесь

Как добавить исключение try catch
Чтобы могли только выводить до матрицы 4х4 package Germanx; /** * * @author German */ import java.util.Scanner; ...

Не подскажете как реализовать тут исключение try catch?
void prim3() { cout &lt;&lt; &quot;Vvedite scorost ot 1 do 12&quot;&lt;&lt;endl; do { std::cout &lt;&lt; &quot;Vvedite scorost ot 1 do 12&quot; &lt;&lt;...

Как обработать исключение?
Во время работы приложения (При проблемах с сервером) Ping.Send(); не получает работающего адреса, из-за чего вылазит исключение...

Как обработать исключение?
Здравствуйте. DirectoryInfo dir = new DirectoryInfo(@&quot;С:&quot;); foreach (var item in dir.GetDirectories()) { ...

Ошибка в с try - catch блоке
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #include &lt;Math.h&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru