powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как красивей записать без громоздких try catch
25 сообщений из 34, страница 1 из 2
как красивей записать без громоздких try catch
    #38911109
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть линейный код, состоящий из последовательных команд, которые могут давать ошибки. Это достаточно критические команды обращения к внешним ресурсам и вероятность падения на них велика. Нужно, чтобы при падении определённого шага срабатывал обработчик ошибки, который бы логгировал, какой именно шаг упал, в понятном человеку виде (без Network Error at line 687), а в более понятном виде "Ошибка при считывании ..." .

У кого-нибудь есть идеи как написать такой код без многократных try catch.

Код: 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.
                        ServerInfo server = null; 
                        try
                        {
                            server = new ServerInfo
                            {
                                ServerName = reader.GetString(reader.GetOrdinal("ServerName")),
                                IsMaster = reader.GetBoolean(reader.GetOrdinal("IsMaster")),
                                IsUpdated = (reader.GetString(reader.GetOrdinal("ServerStatus")) == "UPDATED"),
                            };
                            servers.Add(server);
                        }
                        catch(Exception e)
                        {
                            OnError("Ошибка при считывании метаданных", e); 
                        }

                        try
                        {
                            server.Server = ServerManager.OpenRemote(reader.GetString(reader.GetOrdinal("ServerName")));
                        }
                        catch (Exception e)
                        {
                            OnError(string.Format("Ошибка при обращении с серверу IIS {0}", server.ServerName), e);
                        }
                        // и так далее
                        SiteCollection sites = server.Server.Sites;
                        Site site = sites["Default Web Site"];
                        server.IsOn = site.State == ObjectState.Started;



Код будет работать в SSIS пакете.

Может как-то ExecuteAndLog(delegate() { код}, "текст ошибки" );?
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911118
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,
Обработчик ошибок на базовом уровне Application. Там же можно ловить определенный тип эксепишена и логировать по вкусу.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911143
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Axelerona_voronin,
Обработчик ошибок на базовом уровне Application. Там же можно ловить определенный тип эксепишена и логировать по вкусу.

Мне кажется вы не поняли моего вопроса. И еще раз обращаю внимание, это SSIS пакет. Никакого класса Application не будет как в C# проектах. Тип Exception неизвестен. Это администрирующий API.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911155
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя каша гавнокода, такое отлаживать крайне сложно.

Разбей хотя бы на 2 функции:

1. Сначала валидация с подготовкой модели
2. Потом логика на основе модели

На этапе валидации (reader.GetString) отрабатываем каждое свойство и накапливаем коллекцию с ошибками. Если коллекция содержит элементы, бросаем исключение с информацией по всем ошибкам и не переходит к пункту 2. Иначе переходим к пункту 2 и начинаем работать с моделью.

Мог бы посоветовать еще fluently transient exception handling , но тут SSIS пакет. Кстати, об этом нужно сразу говорить, гадалки в отпусках.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911186
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУУ тебя каша гавнокода, такое отлаживать крайне сложно.

Разбей хотя бы на 2 функции:

1. Сначала валидация с подготовкой модели
2. Потом логика на основе модели

На этапе валидации (reader.GetString) отрабатываем каждое свойство и накапливаем коллекцию с ошибками. Если коллекция содержит элементы, бросаем исключение с информацией по всем ошибкам и не переходит к пункту 2. Иначе переходим к пункту 2 и начинаем работать с моделью.

Мог бы посоветовать еще fluently transient exception handling , но тут SSIS пакет. Кстати, об этом нужно сразу говорить, гадалки в отпусках.

Ещё раз попробую донести, это не Console Application, это не Web Service это не Web Site это не WinForms, MVC3 или что-то такое. Это скрипт встраиваемый в SSIS пакет. Давай может MVC3 прикрутим сюда?

И ты серьезно считаешь, что вот это читаемо ? Но выглядит красиво.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
// Retry a specified number of times, using a function to 
// calculate the duration to wait between retries based on 
// the current retry attempt, calling an action on each retry 
// with the current exception, duration and context provided 
// to Execute()
Policy
  .Handle<DivideByZeroException>()
  .WaitAndRetry(
    5, 
    retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), 
    (exception, timeSpan, context) => {
      // do something
    }
  );
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911239
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninЕщё раз попробую донести, это не Console Application, это не Web Service это не Web Site это не WinForms, MVC3 или что-то такое. Это скрипт встраиваемый в SSIS пакет. Давай может MVC3 прикрутим сюда?
У тебя проблемы с пониманием или вообще с головой? Ты читаешь каким местом?

МСУМог бы посоветовать еще fluently transient exception handling, но тут SSIS пакет.

Для тех, кто в танке: я тебе и не предлагал в SSIS пакете использовать этот exception handling. Это было сказано для первого твоего вопроса, в котором ничего про SSIS не говорится. Будет полезно для остальных, кому интересен этот момент. Для SSIS я тебе нарисовал 2 простых правила, которому должен соответствовать твой код.

a_voroninИ ты серьезно считаешь, что вот это читаемо ? Но выглядит красиво.
Не мне судить, но Scott Hanselman видит в этом нечто интересное. Весьма гибкие конструкции.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911241
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУв котором ничего про SSIS не говорится.
Было, внизу
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911247
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronМСУв котором ничего про SSIS не говорится.
Было, внизу
Точно, не увидел нижнюю строчку. Тогда берем и прикручиваем к SSIS
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911249
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае, было написано это

МСУМог бы посоветовать еще fluently transient exception handling, но тут SSIS пакет.

Поэтому непонятны вопли про Web Service, Web Site, WinForms и MVC3.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911261
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУAxeleronпропущено...

Было, внизу
Точно, не увидел нижнюю строчку. Тогда берем и прикручиваем к SSIS

Так что умник, посоветуешь что-то полезное? Я пока вот так оформился.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
                        SafeExecute(delegate()
                        {
                            server.Server = ServerManager.OpenRemote(server.ServerName);
                        }, 
                        string.Format("Ошибка при обращении с серверу IIS {0}", server.ServerName)); 

                        Site site = null;
                        SafeExecute(delegate() { 
                            SiteCollection sites = server.Server.Sites;
                            site = sites["Default Web Site"];
                        }, "Не удалось открыть сайт"); 
                        
                        SafeExecute(delegate() { 
                            server.IsOn = site.State == ObjectState.Started;
                        }, "Не удалось узнать статус сайта"); 
 
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911265
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninТак что умник, посоветуешь что-то полезное? Я пока вот так оформился.
Я тебе 2 пункта написал. Ты понял, о чем они?
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911284
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУa_voroninТак что умник, посоветуешь что-то полезное? Я пока вот так оформился.
Я тебе 2 пункта написал. Ты понял, о чем они?

Да понял. Писал бы Web форму поступил бы именно так. Однако не понял зачем мне модель, если я не собираюсь валидировать никаких данных.

Есть
ЗапуститьЧерныйЯщик1;
ЗапуститьЧерныйЯщик2;
ЗапуститьЧерныйЯщик3;
ЗапуститьЧерныйЯщик4;

как красиво запускать их логгируя возможные исключения? В этом мой вопрос.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911302
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninДа понял. Писал бы Web форму поступил бы именно так. Однако не понял зачем мне модель, если я не собираюсь валидировать никаких данных.
Да причем тут web форма, это касается вообще любого кода. В своём DTS Script Task делаешь классы, представляющие модель. И отдельный сервис валидации (класс помощник), который фетчит ридер, собирает модель, складывает ошибки. После этого анализируешь ошибки и если всё ок, дергаешь другой сервис для процессинга данных.

a_voroninкак красиво запускать их логгируя возможные исключения? В этом мой вопрос.
Когда в твоём коде порядок, тогда и обычные try catch будут гармонично смотреться. SafeExecute твой лапшекод лучше не сделают.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911315
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ И отдельный сервис валидации (класс помощник), который фетчит ридер, собирает модель, складывает ошибки.


сервис валидации (класс помощник), который фетчит ридер --- сильно. Вместо 10 строк -- 500. Может лучше Entity Framework прикрутить?
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911328
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

при чем тут количество строк? ты спросил как правильно и как удобно.
тебе ответили, что разбивание кода на процедуры\классы лучше, чем просто процедуры небоскрёбы, где по 5 try catch как у тебя.
читаемость кода от этого выигрывает, соответственно с сопровождением кода проблем не будет. Так как даже если исключение возникнет, тебе будет легко его локализовать.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911330
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninсервис валидации (класс помощник), который фетчит ридер --- сильно.
Ну если Single responsibility principle для тебя сильно, тогда мне нечего добавить.

a_voroninВместо 10 строк -- 500
Ты измеряешь качество кода количеством строк?

a_voroninМожет лучше Entity Framework прикрутить?
Тебе виднее, поэтому вопрос не по адресу.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911348
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУa_voroninсервис валидации (класс помощник), который фетчит ридер --- сильно.
Ну если Single responsibility principle для тебя сильно, тогда мне нечего добавить.

a_voroninВместо 10 строк -- 500
Ты измеряешь качество кода количеством строк?

a_voroninМожет лучше Entity Framework прикрутить?
Тебе виднее, поэтому вопрос не по адресу.

Есть задача -- посадить растение 10 см в высоту. Уместный инструмент -- лопата.
Есть задача -- выкопать котлован 100 в длину. Уместный инструмент -- экскаватор.

Ты же мне говоришь -- та ты что рихнулся в век экскаваторов сажать огурцы с помощью лопаты.

Тут надо прочитать список серверов. Всё. Прочитать -- не записать, не провалидировать, а прочитать. Тут модель-то заводить не обязательно, а ты про Single responsibility principle затеял.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911373
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninЕсть задача -- посадить растение 10 см в высоту. Уместный инструмент -- лопата.
Есть задача -- выкопать котлован 100 в длину. Уместный инструмент -- экскаватор.
1. Что ж ты при такой элементарной задаче в 10 см просишь у форума помощи? Значит, начинаешь испытывать проблемы с гавнокодом?
2. Завтра тебя просят нарастить растение еще на 10 см, и твой карточный домик схлопывается. Когда пишешь лапшекод, ты заранее себя обрекаешь на гибель.
3. Повторяю еще раз, если ты считаешь, что концепция single responsibility principle - котлован, то можешь отправляться сразу в детский сад, там тебе всё объяснят.

a_voroninТы же мне говоришь -- та ты что рихнулся в век экскаваторов сажать огурцы с помощью лопаты.
Ты реально отмороженный? :)

Хвост
Коллега, заходи. Тут новое тело для битья, заодно потренируешься на ламерах обезьянках
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911378
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУТы реально отмороженный? :)

От отмороженного слышу.

Я спросил про try catch , а ты про валидацию модели лекцию затеял.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38911411
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninЯ спросил про try catch , а ты про валидацию модели лекцию затеял.
У тебя "оптимизация" (как всегда) через задний проход начинается. То есть ты не решаешь проблему, а пытаешься её обернуть в этикетку. Дело твоё, тебе дали советы. Не понимаешь советы - ну можешь убиться об стену.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38912713
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

што называется, для самых упоротых:

...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38913213
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала, у приложения, которое я пишу, код на .NET C# составляет лишь 2-3%. А вы пытаетесь загнать слона в посудные лавки. Там, где надо 1 2 3 4 выполнить и 2 + 2 посчитать, мега архитектуру привинтить хотите.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38913233
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninДля начала, у приложения, которое я пишу, код на .NET C# составляет лишь 2-3%.


А остальное что?
Там, где надо 1 2 3 4 выполнить и 2 + 2 посчитать, мега архитектуру привинтить хотите.

Кусок кода из первого поста не сильно похож на 2 + 2. Но если это так, то какой смысл чего-то там уплотнять в блоках try-catch, если оно 2+2 и 2% от общей массы?
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38913276
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisa_voroninДля начала, у приложения, которое я пишу, код на .NET C# составляет лишь 2-3%.


А остальное что?
Там, где надо 1 2 3 4 выполнить и 2 + 2 посчитать, мега архитектуру привинтить хотите.

Кусок кода из первого поста не сильно похож на 2 + 2. Но если это так, то какой смысл чего-то там уплотнять в блоках try-catch, если оно 2+2 и 2% от общей массы?

Pallaris,

SSIS пакеты, база SQL Server 2014, OLAP кубы, SQL Server Agent джобы.

Просто у SSIS уже есть своя архитектура классов. Там есть свой Framework и переписывать его не надо.
...
Рейтинг: 0 / 0
как красивей записать без громоздких try catch
    #38913411
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pallarisa_voroninкакой смысл чего-то там уплотнять в блоках try-catch, если оно 2+2 и 2% от общей массы?
Пациенту требуется шоковая терапия. Умные правильные советы идут лесом
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / как красивей записать без громоздких try catch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]