Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.72.78] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
В стандарте C++ есть такой оператор:
try { } catch() { } очень хороший оператор. Внимание: вопрос. Кем определяется поведение при выполнении данного оператора? Т.е. - это наверное зависит от операционной системы? Вычитал недавно в одной умной книжке, что "в NT обработка исключений заложена на уровне ядра". Что означает сия фраза? Значит, если я в 9x использую оператор, то у меня ничего не выгорит? А в UNIX-ах? Если это сделано на уровне ядра, то наверное при входе в подобный блок создается какой то объект ядра, который.. ну и так далее? Если нет, то тогда как? Отдалимся от теории, и зададим практический вопрос. Если это НЕ объект ядра, то что делает процессор при наличае нескольких крит. секций? Ну например: у меня есть несколько потоковых функций, которые заключены в try - catch. Потоковые функции выполняются долго, практически вечно. Может ли в ОСи существовать несколько подобных блоков (интересует наблюдения не только в NT-шных, но и других осях - особливо 9x, ну и до кучи - *nix-ы). |
Сообщ.
#2
,
|
|
|
мне тоже охота порассуждать на эту тему
Я всегда (когда подучился) предпологал что есть функции, операции, которые выбрасывают исключения, если нет catch то это как выброс из функции все выше и выше, без всяких ретурнов. Но первый catch который ловит данное исключение остановит подобный moveback. Никакое ядро за это не отвечает. Если я вычитаю два double сам (с занулением), то могу вызвать исключение могу на него забить. |
Сообщ.
#3
,
|
|
|
а как тогда насчет вот такого:
Цитата "в NT обработка исключений заложена на уровне ядра" то есть, они готовы ловить исключения, которые предусмотренны? То есть если CFileException или CMemoryException от MFC - NT готова поймать, а если что то свое? (ну, напишу я в throw просто вот так вот: throw(char *){return MY_EXCEPTION_OCCURED;} ) - то NT ловить его не будут? Тогда это не есть хорошо. А в чем будут различая на 9x? Моя что то совсем понимать перестала. Да, и по поводу количества открытых try()-ев вопрос открыт до сих пор. В доке я ничего подобного не нашел. Сказано - что "можно критические штюки заключать в try" . А когда нельзя заключать ( и почему!) -- ничего не сказано. |
Сообщ.
#4
,
|
|
|
Для начала надо определиться. Есть исключения, специфицированные стандартом C++ (try/catch). За их поддержку отвечает CRTL. Но в операционных системах могут быть свои механизмы генерации и обработки исключительных ситуаций. В Win32 - это так называемый SEH (Structured Exception Handling), в *NIX - это сигналы. Ну и т. д. По идее (и в общем случае), механизмы, заложенные в операционные системы никакого отношения к C++-исключениям не имеют. В случае с NT многие исключения ОС превращаются в программные исключения все той-же CRTL и их можно ловить на три точки (catch(...)), но лучше - через блоки __try/__except, т. к. в этом случае можно получить доп. информацию об исключении.
|
Сообщ.
#5
,
|
|
|
то есть - ответственность берет CRTL? Хорошо.
Если exception-а не случается, то CRTL вообще забивает болт на это дело? Мне все таки интересно узнать, как уживаются несколько исключений. |
Сообщ.
#6
,
|
|
|
Цитата AQL, 29.01.04, 12:04 Если exception-а не случается, то CRTL вообще забивает болт на это дело? В смысле? Ты можешь сгенерировать исключение сам (с использованием throw). |
Сообщ.
#7
,
|
|
|
хм. сам - это хорошо.
В общем - идея такая. Нужно как бы подстраховаться. Всю функцию потока я хочу обнести одним большим try() - потому что мало ли чего. При этом если случается какая либо беда - не важно какая (она может случиться где угодно и когда угодно - конкретизировать место я не хочу) было сгенерировано исключение, при этом поток должен КОРРЕКТНО завершить свою работу, и отослать ответсвенному лицу (мне то есть) письмецо: "обратите внимание на логи, котоые сделал поток такой то, потому что там произошла какая то беда". При этом остальные потоки должны продолжать работать. Корректно ли заключить всю функцию потока в один большой try()? Так как потоков будет много - то получиться несколько try секций. Они уживутся? |
Сообщ.
#8
,
|
|
|
работу корректо завершать на мой взгляд надо не в catch а в finally
если ты функцию потока обнесешь try то ты же из неё уже вывалишся !? для корректности надо ловить ошибки в том месте где они появляются. |
Сообщ.
#9
,
|
|
|
? какая жаль. А я хотел все устроить как можно проще.. ладно, придется подумать
и погемороиться. Вся беда в том, что мне в общем то не интересно, что за исключение произошло. Мне важно то, что оно произошло. А уж что там происходило - я в логах посмотрю. |
Сообщ.
#10
,
|
|
|
AQL, не все так плохо
try { // что-то делаешь } catch (...) { // посылаешь письмо } в функции потока тебе поможет ) Sazabis, во-первых, finaly в C++ нет и (я думаю) не будет. Во-вторых, вместо этого есть замечательная парадигма "объявление есть инициализация", в соответствии с которой выделение ресурсов должно быть в конструкторе соотв. класса, а разрушение - в деструкторе. Тогда никакой try-catch тебе не страшен, т. к. гарантируется, что в процессе раскрутки стека вызываются деструкторы всех локальных объектов. |
Сообщ.
#11
,
|
|
|
О! Именно это я и хотел услышать. Супер. Я то уж стал было думать, что
придется сдецл погемороиться. Я чувствовал, что такое должно прокатить! |
Сообщ.
#12
,
|
|
|
Цитата AQL, 29.01.04, 12:53 О! Именно это я и хотел услышать. Супер. Я то уж стал было думать, что придется сдецл погемороиться. Я чувствовал, что такое должно прокатить! Но должен тебя предупредить - это считается плохим стилем. |
Сообщ.
#13
,
|
|
|
- так - а где же плачущий смайлик?
|
Сообщ.
#14
,
|
|
|
прошу обратить внимание на __finally а не finaly
в подобных вариантах FILE *fn; try{ fn = fopen(...; } __finally{ fclose( fn ); } или cMyClass *mc = new cMyClass; try{ if( func( mc ) == (any) )return true; for( ... )if( ... )return ... } __finally{ delete mc; } return false; можно конечно и return delete mc, true; или cMyClass mc; func( &mc ); но это как пример я написал. |
Сообщ.
#15
,
|
|
|
__finaly (как явствует из MSDN) - C и C++ расширение от Microsoft. Сделано специально для обработки SEH-исключений. В частности:
Цитата Note Structured exception handling works with Win32 for both C and C++ source files. However, it is not specifically designed for C++. You can ensure that your code is more portable by using C++ exception handling. Also, C++ exception handling is more flexible, in that it can handle exceptions of any type. For C++ programs, it is recommended that you use the new C++ exception-handling mechanism (See try, catch, and throw statements). Таким образом, не изветсно - как он поведет себя с деструкторами и т. п. А твой пример легко приводится вот к такому виду: try { std::ifstream file(...); } catch (...) {;} и std::auto_ptr<cMyClass> mc(new cMyClass(...)); try { if( func( mc ) == (any) )return true; for( ... )if( ... )return ... } return false; и никакой головной боли. |