metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2008-06-25 02:35 pm

Почему у людей в головах такой страшный бред?

отсюда

Q. У меня неправильно работает многопоточное приложение, иногда не снимается блокировка с ресурса.
A1, нормальный :Используйте правильный паттерн блокировки с обработкой исключений
A2, от красноглазых психов: Используйте POSIX, потому что микрософтовские поделки глючны и содержат в себе только маркетинговые ходы.

Практика показывает, что в то время, как среди программеров под винду очень много программистов не самого высокого уровня, в силу плавной кривой обучений и низкого порога входа, забабоны программистов под юниксы отличаются таким уровнем разнообразия и неадекватности, что от безумных результатов не спасает даже более высокий их средний уровень.

[identity profile] ivankon.livejournal.com 2008-06-25 01:47 pm (UTC)(link)
Исключительные ситуации, которые возникают в нити, надо обрабатывать в этой же нити. Еще не хватало из нити в нить исключения кидать...

[identity profile] qehgt.livejournal.com 2008-06-25 01:55 pm (UTC)(link)
я об этом и говорю. Но тогда исключения становятся не тем, для чего они предназначались (способом обработки ошибок на другом, внешнем уровне), а банальным кодом возврата из функции. И вместо линейного кода, в котором легко видно логику работы, получается сложная нарезка из try/catch.

[identity profile] metaclass.livejournal.com 2008-06-25 02:02 pm (UTC)(link)
Исключения более удобный способ раскрутки стека вызовов при ошибке, чем коды возврата. И внешнесть уровня тут именно в том, что их не нужно перехватывать на каждом вызове, в отличие от кодов возврата. Вот try/finally для корректного освобождения делать надо, если нету каких-нибудь аналогичных методов, типа объекта-мютекса на стеке с освобождением в деструкторе в с++.

[identity profile] psilogic.livejournal.com 2008-06-25 02:46 pm (UTC)(link)
А кто вам сказал, для чего они предназначались?

[identity profile] qehgt.livejournal.com 2008-06-25 03:14 pm (UTC)(link)
One of the most powerful features of exception handling is that an error can be thrown over function boundaries. This means that if one of the deepest functions on the stack has an error, this error can propagate up to the upper function if there is a trying-block of code there. This allows programmers to put the error handling code in one place, such as the main-function of your program.

[identity profile] qehgt.livejournal.com 2008-06-25 03:18 pm (UTC)(link)
Первое же предложение в Стандарте С++, глава "Exception handling":

Exception handling provides a way of transferring control and information from a point in the execution of a program to an exception handler associated with a point previously passed by the execution

[identity profile] psilogic.livejournal.com 2008-06-25 05:08 pm (UTC)(link)
И как эта цитата связана с тем, что вы написали?

"не тем, для чего они предназначались (способом обработки ошибок на другом, внешнем уровне), а банальным кодом возврата из функции."

Вообще-то банальный код возврата из функции - это один из способов обработки ошибок на внешнем уровне (на уровне функции, которая вызвала ту функцию).

[identity profile] qehgt.livejournal.com 2008-06-25 09:25 pm (UTC)(link)
Прямо и связана. "Код возврата" проверяется на уровне N-1, а exception - хоть на N-1, хоть на N-100.

[identity profile] psilogic.livejournal.com 2008-06-25 09:48 pm (UTC)(link)
Ну код тоже можно передать через несколько уровней. Тут дело вовсе не в числе уровней, и не в передаче исключений из треда в тред. Это уже полный бред: если из-за внешнего исключения тред будет прекращать управление где попало, замучаешься предусматривать все. Дело тут в другом принципе передачи управления.

C++ исторически рождался как upgrade для C, который усовершенствует существующие возможности C.
Исключения в C++ - это наследие C-шного setjmp/longjmp. Фамильные следы происхождения можно заметить в этой фразе:

"exception handler associated with a point previously passed by the execution"

Именно так. Обработчик исключений ассоциируется с точкой, которую раньше прошли при исполнении. Это и есть setjump: когда его вызывают, то запоминается место вызова, а потом longjmp-ом происходит скачок туда через сколько угодно уровней. В C++ реализовано фактически то же самое, но намного удобнее.