Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.200.226] |
|
Страницы: (37) « Первая ... 33 34 [35] 36 37 ( Перейти к последнему сообщению ) |
Сообщ.
#511
,
|
|
|
Цитата Wound @ Вот именно. На практике я заметил, что в языках с поддержкой нормальных макро, использовать возврат ошибок не сложнее и не легче, чем исключения. Это скорее вопрос вкуса/религии или традиций самого языка.Ну если там int'ы возвращаются, или какие нибудь char'ы, строки, то тут конечно без доков ниче не поймешь. В COM'ах всяких наприме всякие HRESULT'ы возвращаются, этих там кодов овер дофига, а каждая функция, естественно не все возвращает, и приходится тоже лезть в доку. Если бы там как то разграничить эти коды, возможно было бы проще. В языках вроде плюсов, D, JavaScript исключения однозначно удобнее, так как проброску возвращаемых ошибок придется делать вручную или уродливым препроцессором или строковым миксином (для D). Тем более, что в D и JavaScript ещё и стектрейс есть. Добавлено Цитата Wound @ Для сей вся дискуссия бессмысленна. В сях нет исключений. SEH это чисто виндовая фигня не имеющая к стандартным сям никакого отношения. Сях все равно это преврящается в ручной вызов функции очистки. Я то говорил в контексте Си, а не С++. |
Сообщ.
#512
,
|
|
|
Цитата applegame @ На практике я заметил, что в языках с поддержкой нормальных макро, использовать возврат ошибок не сложнее и не легче, чем исключения. О каких языках речь? |
Сообщ.
#513
,
|
|
|
Цитата OpenGL @ Я непосредственно работаю в elixir, аналогичное можно замутить в Nim и Crystal. в Rust, вроде тоже есть что-то для этого, то ли макро, то ли что-то встроенное в сам язык. О каких языках речь? |
Сообщ.
#514
,
|
|
|
Цитата Wound @ Ну так перечитай ещё раз. Там всё расписано. Вот Qraizer там про SEH писал и что исключения очень хорошо ложатся в модель Си. Но лично я не понимаю как они туда ложаться. Ведь в том же Си нет ни конструкторов, ни деструкторов. При генерировании исключения, которое проглядели - утечка гарантирована ИМХО. Добавлено В SEH нет. Добавлено void doSomething(void) { void *buf = NULL; __try { buf = malloc(BUF_SIZE); /* blah-blah-blah */ doEvilFunc_thatRaises_EXCEPTION_INT_DIVIDE_BY_ZERO(); /* blah-blah-blah */ } __finally { if (buf != NULL) free(buf); } } |
Сообщ.
#515
,
|
|
|
Цитата Qraizer @ В SEH нет. Ну так а чем это отличается от goto cleanup: ? Разве что goto писать не нужно, но __try нужно, и __finally не забыть, и не забыть очистить все ресурсы. Плюс ко всему если ты пишешь кросплатформенный код, то такой трюк уже не прокатит, либо придется писать еще и макросы в придачу. |
Сообщ.
#516
,
|
|
|
Фенечка для GCC:
# include <stdio.h> /* Demo code showing the usage of the cleanup variable attribute. See:http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html */ /* cleanup function the argument is a int * to accept the address to the final value */ void clean_up(int *final_value) { printf("Cleaning up\n"); printf("Final value: %d\n",*final_value); } int main(int argc, char **argv) { /* declare cleanup attribute along with initiliazation Without the cleanup attribute, this is equivalent to: int avar = 1; */ int avar __attribute__ ((__cleanup__(clean_up))) = 1; avar = 5; return 0; } |
Сообщ.
#517
,
|
|
|
Цитата Wound @ Нелокальностью. Ты не сделаешь goto далеко наружу, но можешь longjmp(). Локально же ты можешь сделать не только goto, но ещё и return, break и continue.Ну так а чем это отличается от goto cleanup: ? Цитата Wound @ Патерн в той теме, что ты приводил как пример из MSDN, как раз для условий отсутствия SEH, там какой-нибудь goto cleanup вполне себе нормально. Но опять же локально, и как ты говоришь, нужно не забыть везде так прописать. Забыл и влепил return, усё, приехали. И фактически он реализует лишь break, что-либо другое реализовать на нём можно, но всё сразу... И проблема с нелокальностью всё равно остаётся, longjmp()-у коллинеарно на твои goto внутри снимаемых с исполнения функций.Разве что goto писать не нужно, но __try нужно, и __finally не забыть, и не забыть очистить все ресурсы. Не забыть – естественно. Ну так на то это и Structural Exteption Handling. RAII на классах делает это гораздо удобнее, уже не забудешь. Та и на кодах ошибки же всё равно тоже надо не забывать прописывать очистки. Цитата Wound @ Я разве не говорил, что на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно? И всё потому, что SEH не языковой механизм. Плюс ко всему если ты пишешь кросплатформенный код, то такой трюк уже не прокатит, либо придется писать еще и макросы в придачу. |
Сообщ.
#518
,
|
|
|
Цитата Qraizer @ на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно? |
Сообщ.
#519
,
|
|
|
Цитата Qraizer @ Нелокальностью. Ты не сделаешь goto далеко наружу, но можешь longjmp(). Локально же ты можешь сделать не только goto, но ещё и return, break и continue. Так подожди, в твоем коде нет __catch, если я не забыл, он там должен быть для обработки исключения. Соответственно если в функции выше нет этого __catch, значит в ней будет утечка, если ресурсы выделились? Или ты хочешь сказать что предется все функции оборачивать в __try/__finaly? Цитата Qraizer @ Я разве не говорил, что на WinAPI легко писать отказоустойчивый код, а на POSIX это в принципе невозможно? И всё потому, что SEH не языковой механизм. ну не помню, может быть в той статье про SEH ты что то упоминал. |
Сообщ.
#520
,
|
|
|
Цитата Wound @ Зачем он мне там? Я не хочу заниматься не своим делом. Так подожди, в твоем коде нет __catch, если я не забыл, он там должен быть для обработки исключения. |
Сообщ.
#521
,
|
|
|
Цитата Qraizer @ Зачем он мне там? Я не хочу заниматься не своим делом. Ну так я и говорю, допустим кто то вызовет твою функцию, в своей функции, но перед вызовом выделит ресурсы, и забудет обернуть в __try/__finally - в итоге будет утечка ? Т.е. при таком подходе придется тело каждой функции, где есть выделение ресурсов оборачивать в __try/__finally ? |
Сообщ.
#522
,
|
|
|
Ну да. Если я соблюдаю свой контракт, это не означает, что я отвечаю за чужие. Но вот что однозначно верно в случае SEH – мои контракты порушить никто не способен. Я их буду выполнять всегда, каким бы злым не был окружающий меня код.
|
Сообщ.
#523
,
|
|
|
Wound, все решается документацией и качеством оформления кода, если либа не для себя, а в команду или паблик. Если есть гарантии, что исключений не будет - не нужно конечно. А если знаешь, что исключения могут быть, будь добр - не забывай. А то так договоримся, что ты забудешь, что делить на ноль нельзя, но обвинишь разработчика либы, которую пользуешь.
Скрытый текст ЗЫ: Да и для себя лучше не лениться, и делать все что нужно |
Сообщ.
#524
,
|
|
|
__attribute__(cleanup) не всесилен. Локальную размотку он делает, а вот глобальную прощёлкивает. Правда, в режиме C++ не прощёлкивает исключения, но кому оно такое надо в Плюсах? Там своё есть, языковое.
|
Сообщ.
#525
,
|
|
|
Цитата Qraizer @ но кому оно такое надо в Плюсах Конечно. |