Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,028
1

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

29.03.2018, 14:17. Просмотров 3509. Ответов 11

Как по уму делают проброс исключений чтобы не было потерь в стеке?
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
13486 / 10450 / 2749
Регистрация: 17.09.2011
Сообщений: 17,763
29.03.2018, 18:58 3
Цитата Сообщение от ht1515 Посмотреть сообщение
чтобы не было потерь в стеке?
Если под потерями в стеке подразумевается сброс Stack Trace, то бросается так, как выше указал товарищ csproj.
Если по какой-то причине нужно перехватить исключение и бросить свое, то перехваченное исключение передается в конструктор бросаемого как Inner Exception.
0
шарпопочитатель
58 / 25 / 7
Регистрация: 31.01.2010
Сообщений: 1,028
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
496 / 423 / 177
Регистрация: 23.11.2014
Сообщений: 932
29.03.2018, 22:34 6
ht1515, Можно использовать еще ExceptionDispatchInfo.Capture, но для обычного проброса используют throw.

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

Цитата Сообщение от ht1515 Посмотреть сообщение
Это норм практика?
лучше обозначить кастомный класс, унаследованый от Exception. Мне расказывале о подходе, где для каждого такого перехвата создавался свой Exception-class (как по мне, чертовски избыточно) чтобы было сразу понятно, где завалилось.
0
Эксперт .NET
13486 / 10450 / 2749
Регистрация: 17.09.2011
Сообщений: 17,763
04.04.2018, 13:47 8
Цитата Сообщение от Wolfdp Посмотреть сообщение
если так пробрасывать, то в стектрейсе будет указание на строчку throw
Это ничего страшного — главное, что при этом не теряется стек до строчки throw.
Добавление — все-таки не потеря.
0
904 / 808 / 208
Регистрация: 15.06.2012
Сообщений: 3,186
Записей в блоге: 1
04.04.2018, 14:45 9
kolorotur, порой фиг поймешь, где ошибка, особенно если что-то из рубрики null-reference
0
Эксперт .NET
13486 / 10450 / 2749
Регистрация: 17.09.2011
Сообщений: 17,763
04.04.2018, 15:28 10
Цитата Сообщение от Wolfdp Посмотреть сообщение
порой фиг поймешь, где ошибка
Тем более лучше больше информации на руках иметь
0
904 / 808 / 208
Регистрация: 15.06.2012
Сообщений: 3,186
Записей в блоге: 1
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
13486 / 10450 / 2749
Регистрация: 17.09.2011
Сообщений: 17,763
04.04.2018, 17:14 12
Wolfdp, ну да, в трейсе указывается строка, на которой исключение было выброшено.
Если в методе исключение ловится и пробрасывается дальше, то для этого метода строка выброса будет изменена, но предыдущий трейс сохраняется — это специально так сделано.
Речь же шла о потерях в стеке — их и нет.
0
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® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.