Форум программистов, компьютерный форум CyberForum.ru

вопрос к опытным программистам - C++

Восстановить пароль Регистрация
 
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
13.07.2011, 13:22     вопрос к опытным программистам #1
напишите пожалуйста, как часто вам приходилось или приходится использовать для обработки ошибок
механизм try-catch. Возможен ли нормальный возврат в тут точку где было выброшено исключение, если оно преодолело несколько уровней обработки, или такое не практикуется?
Напишите, поделитесь опытом о полезности данной конструкции.
Интересно именно мнение живых людей практикующих с++, т.е. ваше..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2011, 13:22     вопрос к опытным программистам
Посмотрите здесь:

C++ Вопрос по if, else?
C++ Вопрос по массивав, "институтский" вопрос.
C++ Вопрос к опытным програмистам
Всем программистам! C++
Вопрос к программистам, имеющим опыт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
13.07.2011, 13:44     вопрос к опытным программистам #2
AzaKendler, Постоянно использую. Очень полезная вещь.
Возврат в ту точку где было выброшено исключение часто нереален. Если исключение произошло по инициативе твоей программы и ты точно знаешь какие последствия оно несет, то ты можешь его залогировать и продолжить работу. Однако чаще приходят исключения непредвиденные, в этом случае можно например переинициализировать объект в котором произошло исключение.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
13.07.2011, 14:02     вопрос к опытным программистам #3
Вообще-то опыт подсказывает, что для маленьких программулин (Ну, примерно, до 1000 операторов) использование try-catch почти бесполезно. Программа маленкая, ее можно обозреть и так, поэтому применять тяжелую артиллерию (try-catch) смысла мало.
А вот если прога большая, то нужно обработку ошибок-ситуаций ПРОЕКТИРОВАТЬ с самого начала. И потом использовать средства try-catch уже в соответствии с запроектированными решениями, не допуская самодеятельности.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
13.07.2011, 16:57     вопрос к опытным программистам #4
1. Да, всегда.
2. Не возможно и обычно не нужно.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
14.07.2011, 08:47  [ТС]     вопрос к опытным программистам #5
как на ваш взгляд, стоит ли по максимуму наполнять свой класс, который выбрасывается исключением, информацией? или вы в собственной практике обходитесь большинством стандартных заготовок?
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
14.07.2011, 08:54     вопрос к опытным программистам #6
AzaKendler, Чем больше будет информации, тем точнее сможешь понять причину. Однако если сбои будут происходить часто, то твой лог файл может оказаться например очень большим, что усложнит его пересылку.
CAHTEXHUK
Заблокирован
14.07.2011, 10:10     вопрос к опытным программистам #7
насчёт нормального возврата не знаю, но вернуться можно хоть куда, если сильно захотеть
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
void func1()
{
    int adr;
    __asm 
    {
        call $ + 5  // запихнуть в стек адрес след. команды и передать на нее управление
        pop ebx     // вытолкнуть из стека адрес возврата
        mov adr, ebx
    }
 
    
    int a = 70;
    int b = 80;
 
    cout << b - a;
 
    throw adr;
 
}
 
void func2()
{
    int a = 89, b = 54;
    cout << a - b;
    func1();
}
 
 
int main()
{
    try 
    {
        func2();
    }
    catch (int adress)
    {
        __asm 
        {
            call adress
        }
    }
   
   return 0;
}
Добавлено через 2 минуты
как видите, управление возвращается, только там проблема одна - исключение остаётся необработанным, но если ещё сильнее извратиться то и это можно обойти
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 10:59     вопрос к опытным программистам #8
Только вот все переменные, инициализированные до блока асм могут уже быть испорченными. И это требует дополнительного кода (на х64 не работающего).
В любом случае, данный подход не применим, и следующий пример это иллюстрирует.
C++
1
2
3
4
5
6
7
8
9
10
11
12
 try 
        {
                func2();
                func3();
        }
        catch (int adress)
        {
                __asm 
                {
                        call adress
                }
        }
Добавлено через 2 минуты
Цитата Сообщение от AzaKendler Посмотреть сообщение
стоит ли по максимуму наполнять свой класс, который выбрасывается исключением, информацией
Однозначного ответа нет. Чем больше информации, тем удобнее диагностировать и отлаживать. Но чем сложнее класс, тем больше вероятность допустить в нём ошибку. Плюс нужно избегать выделения памяти из кучи (если это требуется, то лучше пул заранее создать), обращения к оборудованию (если исключение сообщает об отказе харда, то пытаться создать лог файл на том же диске, будет не самой лучшей идеей) и т.п.
CAHTEXHUK
Заблокирован
14.07.2011, 11:15     вопрос к опытным программистам #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Только вот все переменные, инициализированные до блока асм могут уже быть испорченными
это можно исправить
на x64 вобще можно rip читать напрямую не извращаясь со стеком, насколько мне известно
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
14.07.2011, 11:18  [ТС]     вопрос к опытным программистам #10
CAHTEXHUK, идеи интересные. но тут большинство советует что возвращаться не нужно.
а адреса хорошо помещаются в int?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 11:29     вопрос к опытным программистам #11
Цитата Сообщение от CAHTEXHUK Посмотреть сообщение
на x64 вобще можно rip читать напрямую не извращаясь со стеком, насколько мне известно
inline ассемблера нету.

Добавлено через 1 минуту
Цитата Сообщение от AzaKendler Посмотреть сообщение
адреса хорошо помещаются в int?
На функции - да. На методы - не очень.) Это если про х86 говорить.
CAHTEXHUK
Заблокирован
14.07.2011, 11:45     вопрос к опытным программистам #12
в программировании этот приём бесполезен, я так привёл пример что возможно и такое. Если крякингом заняться захочешь то полезно уметь распознавать конструкции типа try\catch и уметь с ними работать. Да, в инт как раз помещается на i386
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2011, 12:00     вопрос к опытным программистам
Еще ссылки по теме:

Несколько вопросов к программистам. C++
C++ Вопрос по C++
Экспертам и программистам С++: пройти собеседование и получить работу C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
14.07.2011, 12:00     вопрос к опытным программистам #13
Тогда уж лучше сразу обработчик подменить, раз уж хакерить взялись...
Yandex
Объявления
14.07.2011, 12:00     вопрос к опытным программистам
Ответ Создать тему
Опции темы

Текущее время: 07:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru