|
|
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
Интересует что делать если глобальный объект сгенерировал эксепшн? Где его перехватывать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2004, 21:09 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
может я туплю, но глобальнее main исключения не возникнет :-) взять все в Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2004, 21:28 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
Вот оно как раз в деструкторе.. Я жертва неправильного дизайна? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2004, 22:16 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
согласен с alex_k объект где-то конструируется... приведи пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2004, 22:19 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
Объект глобальный. И конструируеться он конечно, ещё до того как в мэйн попадаем. Деструктор выглядит примерно так: CShopBase::~CShopBase(void) { Save (); } Save может сгенерить эксепшн. Обрабатывать его прямо в деструкторе нехочеться :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2004, 22:34 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
1) никогда не следует допускать исключений в деструкторе, или НЕ ВЫПУСКАЙТЕ их 2) можно метод SAVE вызывать явно до вызова конструктора, например в main 3) а еще лучше отказаться от глобального объекта и написать Синглетон для этого типа. Тогда все будет в твоих руках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2004, 13:28 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
dwl прав. вызывай его перед уничтожением, если, конечно, он у тебя публичный. в противном случае, ловить исключение надо в деструкторе, поскольку save изменяет состояние CShopBase прямо пере тем как уйти в небытие, поэтому отлов исключения вне этого объекта не имеет ни малейшего смысла (зачем, если он dead? завещание? :-) ). Поправте меня, если не прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2004, 17:31 |
|
||
|
Эксепшн глобального объекта
|
|||
|---|---|---|---|
|
#18+
Обрабатывать исключение внутри деструктора нужно еще и по другой ИМХО более веской причине. Напомню, что деструктор вызывается, когда объект выходит из области видимости, или явно, или когда происходит "обработка" исключения, т.е. раскручивание стека. Чем же грозит исключение внутри деструктора? Смертью программы. Смотрим примеры: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. просто примерчик. перед освобождением памяти вызывается деструктор, а он генерит новое исключение, которое остановит по сути раскрутку стека и не даст освободится памяти. Тоже самое будет если объект будет распологаться не в куче. возьмем другой пример. Не буду его писать - просто перепишите предыдущий пример, но как массив "плохих" объектов. Теперь представьте что вызывая деструкторы каждого эелемнта массива, где-то в середине деструктор дал исключение. Массив будет не "освобожден", другие элементы тоже, раскрутка стека для других элементов созданных ДО массива остановится. еще пример. Код: plaintext 1. 2. 3. 4. 5. 6. 7. тут двоякая и даже троякая ситуация. Если исключение произойдет при контруировании объекта, тогда все успевшие создаться объекты будут уничтожаться. Допустим память выделить не удалось, и мы попытаемся удалить плохиша, а он не удалится! На развале этого объекта все остановится, просто представьте, если бы был массив "плохишей" ? Двоякость возникает при рядовом вызове деструкора владельца, а троякость при наследовании 8-)))) В случае с глобальным объектом - упаси вас бог их создавать - все усугубляется неопределенностью вызова конструкторов глобальных обхектов. Т.к. убиваться они будут в порядке LIFO через функцию atexit кажется, а вызов конструкторов для глобальных объектов не определен стандартом. Поэтому неясно кто умрет первым а кто последним. И ставить try catch в main не имеет смысла, потому что область видимости глобальных переменных больше области видимости main, т.к. по определению они декларируются выше. Отсюда вывод(Ы) 1) не создавайте глобальных объектов, заменяйте их синглтонами 2) не выпускайте исключения из деструктора 3) не пишите ОПАСНЫХ обработчиков catch, т.к. см правило (2) 4) не пытайтесь спастьи ситуацию обработкой СМЕРТИ объекта за счет внешнего try catch - до него дело не дойдет. поэтому см правило (2) 5) не пытайтесь переопределить действия функции atexit - будет пушистый и большой ....8-))) вооот. Еще нужны примеры почему исключения нельзя выпускать из деструктора? Их есть у меня... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2004, 19:50 |
|
||
|
|

start [/forum/topic.php?fid=57&tid=2033965]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 323ms |

| 0 / 0 |
