Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/75: Рейтинг темы: голосов - 75, средняя оценка - 4.53
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
1

Правильный проброс исключений

29.03.2018, 14:17. Показов 13588. Ответов 11

Author24 — интернет-сервис помощи студентам
Как по уму делают проброс исключений чтобы не было потерь в стеке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2018, 14:17
Ответы с готовыми решениями:

Обработка исключений. Как организовать общий обработчик исключений?
У меня есть последовательность вызова методов для внесения данных в таблицу БД. Сам метод...

Проброс исключений
Решил спросить здесь, так как не нашел хорошей статьи на данный вопрос. Правильно ли понимаю: если...

Проброс исключений в микросервисах
Ковыряюсь в микросервисах. Используются eureka, zuul, hystrix, feign и т.д. Допустим есть 3...

Обработка исключений с пмощью структурированной обработки исключений
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не...

11
8 / 8 / 1
Регистрация: 18.03.2018
Сообщений: 26
29.03.2018, 18:03 2
В смысле «проброс»?

C#
1
throw;
1
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,137
29.03.2018, 18:58 3
Цитата Сообщение от ht1515 Посмотреть сообщение
чтобы не было потерь в стеке?
Если под потерями в стеке подразумевается сброс Stack Trace, то бросается так, как выше указал товарищ csproj.
Если по какой-то причине нужно перехватить исключение и бросить свое, то перехваченное исключение передается в конструктор бросаемого как Inner Exception.
0
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
29.03.2018, 20:11  [ТС] 4
то есть при
throw
стек трейс теряется (не могу проверит сейчас это просто).

ЧТо стектрейс остался
C#
1
New Exception(e)
делают, так? Это норм практика?
0
8 / 8 / 1
Регистрация: 18.03.2018
Сообщений: 26
29.03.2018, 20:20 5
ht1515, throw; это проброс исключения, т.е. стек не теряется.
0
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
29.03.2018, 22:34 6
ht1515, Можно использовать еще ExceptionDispatchInfo.Capture, но для обычного проброса используют throw.

https://stackoverflow.com/a/730255
0
Эксперт .NET
1696 / 1325 / 316
Регистрация: 15.06.2012
Сообщений: 5,045
Записей в блоге: 3
04.04.2018, 12:45 7
kolorotur, если так пробрасывать, то в стектрейсе будет указание на строчку throw;, думаю TC именно єто и смущает.

Цитата Сообщение от ht1515 Посмотреть сообщение
Это норм практика?
лучше обозначить кастомный класс, унаследованый от Exception. Мне расказывале о подходе, где для каждого такого перехвата создавался свой Exception-class (как по мне, чертовски избыточно) чтобы было сразу понятно, где завалилось.
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,137
04.04.2018, 13:47 8
Цитата Сообщение от Wolfdp Посмотреть сообщение
если так пробрасывать, то в стектрейсе будет указание на строчку throw
Это ничего страшного — главное, что при этом не теряется стек до строчки throw.
Добавление — все-таки не потеря.
0
Эксперт .NET
1696 / 1325 / 316
Регистрация: 15.06.2012
Сообщений: 5,045
Записей в блоге: 3
04.04.2018, 14:45 9
kolorotur, порой фиг поймешь, где ошибка, особенно если что-то из рубрики null-reference
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,137
04.04.2018, 15:28 10
Цитата Сообщение от Wolfdp Посмотреть сообщение
порой фиг поймешь, где ошибка
Тем более лучше больше информации на руках иметь
0
Эксперт .NET
1696 / 1325 / 316
Регистрация: 15.06.2012
Сообщений: 5,045
Записей в блоге: 3
04.04.2018, 16:59 11
kolorotur, так всетаки...

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
public MainWindow()
        {
            InitializeComponent();
 
            try {
                Test();
            }
            catch (Exception ex)
            {
                ; // тут в ex.StackTrace будет указание на #39 и далее на вызов Test();
            }
 
        }
 
        static void Test()
        {
            try
            {
                throw new Exception();
            }
            catch
            {
                throw; // скажем строчка номер 39
            }
        }
Если же

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
public MainWindow()
        {
            InitializeComponent();
 
            try {
                Test();
            }
            catch (Exception ex)
            {
                ; // тут в ex.StackTrace будет также указывать на #39, а вот уже InnerException будет содержать #35
            }
 
        }
 
        static void Test()
        {
            try
            {
                throw new Exception(); // #35
            }
            catch
            {
                throw new Exception(ex); // #39
            }
        }
0
Эксперт .NET
17686 / 12872 / 3365
Регистрация: 17.09.2011
Сообщений: 21,137
04.04.2018, 17:14 12
Wolfdp, ну да, в трейсе указывается строка, на которой исключение было выброшено.
Если в методе исключение ловится и пробрасывается дальше, то для этого метода строка выброса будет изменена, но предыдущий трейс сохраняется — это специально так сделано.
Речь же шла о потерях в стеке — их и нет.
0
04.04.2018, 17:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2018, 17:14
Помогаю со студенческими работами здесь

Indy: программа не получает правильный ответ от сервера, но сниффер показывает правильный ответ
Всем привет. Моя программа должна сделать гет запрос на определенный сайт. Я включаю программу и...

Проброс
Добрый день Ситуация: В наличии dir 100, Системник wimdows XP, 2 сетевых карты(одна внешний...

Проброс порта
для чего и в какой ситуации нужно делать проброс порта??Почему когда передаешь данный по tcp на...

Проброс портов
Всем привет, нужно пробросить порт,находясь за маршрутизатором eltex NTE-RG-1402G-W и роутером...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru