Свежие комментарии

Title Comment
Не говоря о том, что тот экземпляр IO-класса, который мне пе

Не говоря о том, что тот экземпляр IO-класса, который мне передали для IO - он остался у пользователя и можно его просто опросить "что случилос" (да, он должен состояние для этого хранить).

А собственные исключения юзерского класса - пройдут через мо

А собственные исключения юзерского класса - пройдут через мой интерфейс насквозь.

В-общем, наверное так и надо сделать (и так уже и сделано, собственно, осталось описать)

Ой, вот про разные компиляторы я вообще не копенгаген. Попро

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

Насчет контракта, немного смущает вот что: пользователю навязывается, что для информирования об ошибке он должен кинуть исключение, а вот в ответ ему потом придет errorCode. Если это какие-то сетевые ошибки, то как он получит о них информацию? Хотя бы в виде строчки. Я поэтому и предлагал запретить исключения, раз уж все равно сведения теряются.

Тем более, если стремно полагаться на бинарную совместимость. Вот если layout объекта фиксирован, как в .NET, то ради бога. А вот например в COM фиксирован только layout интерфейса, поэтому исключения наружу не летают, ошибки передаются через глобальный объект IErrorInfo (затычка, как errno).

Да, в регистрации ИП наибольшим гемороем было открытие счета

Да, в регистрации ИП наибольшим гемороем было открытие счета. Т.е. в 46-й налоговой и в "статистике" - это все налаженная автоматическая процедура, а в банк я ездил четыре(!) раза.

Правда с тех пор в налоговой и в ПФР бывал, а с банком только по интернету.

1) Вывести на свой личный карточный счет ты можешь вообще вс

1) Вывести на свой личный карточный счет ты можешь вообще все (минус плата банку за обслуживание счета). Банк это не парит вообще, во всяком случае суммы в 2 млн в год (~160 в месяц) вряд-ли кого-то сильно взволнует.

2) На УСН-6% ты должен государству 120 тыс. рублей с 2 млн (взносы в фонды поглотятся этой суммой т.к. налоги можно уменьшить на сумму взносов, но не более чем на 50%).

2б) на ОСНО - не знаю. Точно надо заплатить НДС, а как оно вообще устроено у ИП в таком случае - х.з, не интересовался.

3) Если ты вывел вообще все на свой счет - ты можешь пойти в сберкассу и через окошко заплатить налоги и в фонды. Хотя при наличии расчетного счета и клиент-банка это как-то глупо.

На практике я на р/с накапливаю те самые 6%, которые причитаются государству и раз в квартал их плачу.

я абсолютно не в теме, поэтому у меня совсем n00by вопрос:

я абсолютно не в теме, поэтому у меня совсем n00by вопрос:

предположим я регистрюсь как ИП и оказываю в 2012г услуг IT-консалтинга юрлицам и получаю на круг за год предположим 2 млн.р. на счет безналом.

сколько я смогу через "перевод собственных средств" получить на свой личный карточный счет физлица в российском банке?

ЗЫ. конечно же хочется видеть пример для УСН, и как максимум для ОСН, если ты "как рыба в воде" в этой теме.

В бинарном - только под винды и мак. А stl/boost - это "баз

В бинарном - только под винды и мак.

А stl/boost - это "базовые типы", там проверять каждый чих действительно устанешь. Но LibRaw - это 3-4 вызова на файл, можно и проверить бы.

Про компилятор я вот не вполне понимаю такую вот мелкую дета

Про компилятор я вот не вполне понимаю такую вот мелкую деталь: у меня в LibRaw::open_datastream() передается объект производный от class LibRaw_abstract_datastream; у которого потом дергаются разные виртуальные методы.
Боюсь я, что разные компиляторы породят несовместимую таблицу виртуальных функций в любом разе, до исключений дело не дойдет.

А контракт такого типа
"ваш класс ввода-вывода может кидать исключения LibRaw_exceptions и std::exception, тогда они будут перехвачены и обработаны" - нормальная формулировка?

Ну, мысли такие: по идее контракт с пользователем по исключе

Ну, мысли такие: по идее контракт с пользователем по исключениям ничем логически не отличается от контракта по интерфейсу, и должен оговариваться. Проще всего договорится, что исключения не летят. Т.е. например fread сообщает об ошибке возвращаемым значением или еще чем-то. И пусть пользователь сам в своем объекте это обеспечивает.
Про неизвестные исключения - я не понимаю где и откуда они летят, поэтому сказать ничего не могу. Но если надо все-таки как-то защититься от неразумных пользователей, которые таки кидаются исключениями, то я видел два подхода. Один такой: catch(...), который транслирует неизвестные исключения в какой-нибудь фатальный error code, после которого разрешается только помереть. Вот например SAX-парсер от MSXML именно так и делает - при любых исключениях в callback-ах возвращает какой-то fatal. Для пользователя не очень удобно.
Второй подход: catch(...) -> чистка -> rethrow. Пользователь снаружи LibRaw сможет словить собственные исключения. Но я не знаю как тут с бинарной совместимостью по исключениям, если LibRaw собран одним компилятором, а пользовательский код - другим.
В любом случае, мне кажется, фантазировать "а какой бы мне еще тип исключения словить" не стоит, это контракт.

Да, про деструкторы. Откуда берется идея, что они вообще ес

Да, про деструкторы.

Откуда берется идея, что они вообще есть?
В приложении может быть один глобальный объект LibRaw raw_files_parser;
Вызов raw_files_parser.recycle() приводит его в исходное состояние, деструктор не нужен.

конкретно std::filebuf у меня внутри, но по сути ты прав. Е

конкретно std::filebuf у меня внутри, но по сути ты прав.

Есть некоторый (базовый) класс, реализующий абстракцию I/O. По семантике это FILE* (fseek, fread, fscanf) с небольшими нашлепками, которые для сути дела неважны.
У меня в библиотеке реализованы три имплементации этого класса - для маленького файла (полная буферизация в памяти), для большого файла, для буфера в памяти.

Но пользователь может реализовать свое, скажем для сетевого сокета (fseek придется делать чтением до нужного места, но меня это не парит).
И пользовательская реализация может кидать свои исключения.

А дальше этот класс (производный от него) передается в функцию, которая собственно парсит файл с изображением. Или явно передается (пользовательский класс) или неявно (передается имя файла, а дальше на этом файле сделается одна из моих реализаций).

Функция-парсер, по семантике, возвращает код ошибки. По всей видимости, все исключения, о которых она может догадываться (свои собственнные и от "фирменных" реализаций I/O) она должна перехватывать.

Но что делать с неизвестными исключениями? Особенно с учетом того, что они могут просто летать от мультитредности (говорят вот pthreads в винде сделаны частично на исключениях)....

Ну, для начала, я вообще не люблю этот язык и считаю его изб

Ну, для начала, я вообще не люблю этот язык и считаю его избыточно сложным (и потому - уверенно знаю только некоторый subset, которым и пользуюсь). Это вообще.

А в частности, возможно виноват перевод, но мне кажется, что автор намеренно пытается сделать простые вещи - сложными. Может быть вследствие сложности языка, не знаю.

Тогда простите за вредный совет. Лично мою жизнь эта книга с

Тогда простите за вредный совет. Лично мою жизнь эта книга сделала существенно проще.

Вы распространяете свою библиотеку для разных -никсов в един

Вы распространяете свою библиотеку для разных -никсов в едином бинарном виде? Потому что только в этом случае действует эта рекомендация. Те же stl и boost замечательно бросают исключения.

Мнэээ, Полуэкт... Что-то начинает прояснятся, я видимо снача

Мнэээ, Полуэкт... Что-то начинает прояснятся, я видимо сначала не понял. ;-) Но все равно не хватает подробностей, приходится фантазировать. У вас C++-интерфейс, из которого ничего не должно вылетать. Но внутри вашего кода исключения есть, и их надо наверху преобразовывать в errorCodes. Так? Видимо std::filebuf - это такой callback, который приходит снаружи как параметр, так? Тогда глотать его исключения (заменять на errorCode) - плохо, потеря информации, пользователь обидится. Я бы оборачивал вызовы callback-а в try-catch с последующим rethrow, а преобразование в errorCode делал только со своими исключениями. Если это возможно. Ну или пробовал бы strict-подход, как рекомендуют выше: вся чистка в деструкторах, наружу сложные объекты с такими деструкторами не торчат, и т.д.
Рассчитывать на то, что пользовательский код будет кидать исключениями определенного типа также не стоит.

Долистал до 62-го совета. Гуру рекомендует исключения из би

Долистал до 62-го совета.

Гуру рекомендует исключения из библиотеки не выпускать.

Вот и я так думаю. С той поправкой, что чужие (неизвестные) - пропускать через себя.

Ну, вообще я был уверен, что наружу - только errorcode (тем

Ну, вообще я был уверен, что наружу - только errorcode (тем более, что есть C-интерфейс, какие уж там исключения).
Но несчастный юзер налетел на exception от потрохов (std::filebuf), я не понимаю что должно случиться, чтобы этот filebuf не смог прочитать первые два байта из файла (они там есть!), ну наверное там так ошибка ОС обрабатывается, киданием исключения. Отлично, std::exception от своей имплементации - я поймаю, нивапрос.

Но примерно в то же место пользователь может просунуть свою реализацию потока ввода-вывода, со своими исключениями - и этих я уже не поймаю.

Такое поведение - нормальное? Засунул что-то нестандартное - лови сам!

Я долистал до 39-го указания и понял, что меня тошнит. Попр

Я долистал до 39-го указания и понял, что меня тошнит.

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

Ну и вообще, первые 82 страницы - не понравились. Потому что "жизнь - богаче".

Да, я понимаю, мне тоже было в лом начинать ее читать :) Но

Да, я понимаю, мне тоже было в лом начинать ее читать :) Но там отдельный небольшие главы, удобно.

С учетом того, что меня учили программированию году в 85-м и

С учетом того, что меня учили программированию году в 85-м и на фортране, мне вряд-ли уже что-то такое поможет.

Но посмотрю.

Не, я ни разу не призываю ловить фатальные ошибки, после кот

Не, я ни разу не призываю ловить фатальные ошибки, после которых только и остается, что ползти на кладбище. ;-) Я только о том, что наличие одновременно двух способов обработки ошибок не есть гут. Если исключению позволяется вылететь наружу, то не надо ему мешать это делать erroCode-ами. Ну, например:
catch( std:exception ) {
аккуратно_склеить_ласты();
throw;
}
Если надо отдельно обрабатывать my_own_exception_type, то его надо отдельно и словить. Но это странный подход, именно по причине двойной обработки ошибок _внутри_ вашего кода.

Алексей, если будет у Вас время (и желание), почитайте книгу

Алексей, если будет у Вас время (и желание), почитайте книгу "Стандарты программирования на C++. 101 правило и рекомендация", Герб Саттер, Андрей Александреску. Очень хорошо прочищает голову, лично мне сильно помогла эта книга.

Почему в деструкторах? Вот у меня объект LibRaw, он может о

Почему в деструкторах?

Вот у меня объект LibRaw, он может обработать много файлов. Надо ли ему ломаться и (self-)-деструктиться, если ему подсунули битый файл или такой путь в файловой системе, который не читается?

То есть о деструкторе речь не идет.

В первом комментарии есть ссылка на пост Макса, где ясно нап

В первом комментарии есть ссылка на пост Макса, где ясно написано, что catch(...) вреден для здоровья.

Вот Вы спрашивали про правила хорошего тона в посте? Так вот

Вот Вы спрашивали про правила хорошего тона в посте? Так вот, ВСЕ перечисленное Вами категорически запрещается делать в обработчиках ошибок. Все это должно выполняться в деструкторах. Ссылки на объекты просто так не держать; все делать через смартпойнтеры.

Исключения в потоках - это отстой, да. Видел только одно решение хорошее - в .NET Framework 4.0.

А пользователь some_class::some_function(...) ожидает, что и

А пользователь some_class::some_function(...) ожидает, что из нее может вылететь исключение? Если не ожидает, то вариантов нет: надо ловить все и преобразовывать в код возврата. Но при этом информация об ошибке может частично пропасть.
Если ожидает, то ему навязывается двойная обработка ошибок, что для него довольно неприятно.

Обработка ошибки - это же не только показ сообщения об этой

Обработка ошибки - это же не только показ сообщения об этой ошибке пользователю.

Надо
- аккуратно все позакрывать-поосвобождать (включая всякие промежуточные буферы не на стеке)
- завершить threads (если были)
- ну и вообще, прибрать за собой рабочее место.
То есть в любом случае - нужно на промежуточном уровне (ниже пользователя библиотеки) это все делать.
Ну и сочетание с OpenMP (и прочими lightweight-тредами, вроде TBB) - неиллюзорно доставляет.

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

А как было бы проще, если бы все просто бросали исключения,

А как было бы проще, если бы все просто бросали исключения, а строчка для показа - внутри, да?

хреново она работает. т.е.

хреново она работает. т.е. если кому-то повезло со стеком посылок - да, будут разумные сроки, нет - будет больше месяца ...

наскоько все-таки PCI-3

наскоько все-таки PCI-3 быстрее PCI-1 ...

Импорт 27.12.2011 17:50 104003 МОСКВА PCI-3 3,740 0 0 125413 МОСКВА
Передано таможне 28.12.2011 12:45 104003 МОСКВА PCI-3 3,740 0 0

На PCI-1 это бы заняло больше суток ... посмотрим сколько теперь займет таможня и сортировка ...

Pages

Subscribe to comments_recent_new