Здравствуйте, skyline, Вы писали:
S>Если я забуду обработать одну ошибку в функции, то у меня нарушится логика работы, и вероятно, не будет ни чего плохого, но если я забуду обработать два исключения ... S>Так что уж лучше без них.
Интересный подход... Особенно "...не будет ничего плохого..."
Здравствуйте, Slick, Вы писали:
S>Коллеги, хотелось бы поднять тему обработки исключений в С++ приложениях. S>При разработке системы отслеживания и обработки ошибок в объектно-ориентированном приложении порою сталкиваешься с дилемой: какой подход и в каком случае применять для решения этих задач. Фактически речь идет о выборе между отлавливанием через try-catch, предпологающим написание классов исключений и обычным анализом возвращаемого статуса выполнения. Кто чем пользуется и в каких случаях пользуется?
Давайте конкретизируем обсуждаемый вопрос.
Предположим, для построения механизма обработки ошибок, мы взяли за основу модель исключений try-catch.
Обычным подходом в таком случае, является создание собственного класса исключения, инкапсулирующего информацию о возникшем исключении. Экземпляр этого класса создается в точке возникновения исключения, передается в catch-блок и там обрабатывается.
Вопрос вот в чем.
Что если потенциальных исключений в разрабатываемой системе достаточно много?
Ну, например, некий фрагмент логики, при работе которого может возникнуть 30-40 разного рода исключительных ситуаций.
Очевидно, что заводить свой собственный класс для каждой из потенциально возможных исключительных ситуаций — хреновое решение.
Напрашивается некоторое группирование исключений, с заведением класса исключения для каждой группы и отнесение каждого из исключений к той или иной группе.
По какому принципу стоит разбивать исключения на группы. Может быть по степени фатальноси или по подсистемам где оно возникает?
Пожалуй стоит построить иерархтю классов исключений? Какими критериями руководствоваться при решении такой задачи?
Или может быть нужен в корне другой подход?
Здравствуйте, Slick, Вы писали:
S>Коллеги, хотелось бы поднять тему обработки исключений в С++ приложениях. S>При разработке системы отслеживания и обработки ошибок в объектно-ориентированном приложении порою сталкиваешься с S>дилемой: какой подход и в каком случае применять для решения этих задач. Фактически речь идет о выборе между отлавливанием через try-catch, предпологающим написание классов исключений и обычным анализом возвращаемого статуса выполнения. Кто чем пользуется и в каких случаях пользуется?
В документации к Visual C (Exception Handling: Overview) изложен следующий подход (в моей интерпретации ):
а) Если возникшая ситуация отражена в протоколе функции (метода класса), то следует вернуть соответствующий код ошибки. Например — неверный пароль, переданный в функцию аутентификации.
б) Если какая-то ситуация возникает из-за ошибки времени разработки (например — в функцию передан нулевой указатель), т.е. требуется вмешательство программиста, то исключение не подходит, нужно использовать что-то типа ASSERT().
в) Если возникшую ситуацию нельзя отнести к а) или б), т.е. ты знаешь, что такой поворот допустим во время выполнения, но не знаешь, как выйти из сложивщегося положения, используй исключение — может, кто-то наверху знает? Например — при чтении файла с данными обнаруживается несоответствие формату.
Если вдуматься, то все это заложено в самих терминах: код результата, программная ошибка, исключительная ситуация.
Здравствуйте, Slick, Вы писали:
S> По какому принципу стоит разбивать исключения на S> группы. Может быть по степени фатальноси или по подсистемам где оно S> возникает? Пожалуй стоит построить иерархтю классов исключений?
Очень полезно посмотреть на то, как это сделано в стандартной библиотеке.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Здравствуйте, Slick, Вы писали:
S> По какому принципу стоит разбивать исключения на S> группы. Может быть по степени фатальноси или по подсистемам где оно S> возникает? Пожалуй стоит построить иерархтю классов исключений?
ПК>Очень полезно посмотреть на то, как это сделано в стандартной библиотеке.
А потом посмотреть, как Строуструп ругает эту самую иерархию из STL :))
Ну не знаю. Я обычно исключительные ситуации использую.
А>В документации к Visual C (Exception Handling: Overview) изложен следующий подход (в моей интерпретации ):
А>а) Если возникшая ситуация отражена в протоколе функции (метода класса), то следует вернуть соответствующий код ошибки. Например — неверный пароль, переданный в функцию аутентификации.
А>б) Если какая-то ситуация возникает из-за ошибки времени разработки (например — в функцию передан нулевой указатель), т.е. требуется вмешательство программиста, то исключение не подходит, нужно использовать что-то типа ASSERT().
А>в) Если возникшую ситуацию нельзя отнести к а) или б), т.е. ты знаешь, что такой поворот допустим во время выполнения, но не знаешь, как выйти из сложивщегося положения, используй исключение — может, кто-то наверху знает? Например — при чтении файла с данными обнаруживается несоответствие формату.
А>Если вдуматься, то все это заложено в самих терминах: код результата, программная ошибка, исключительная ситуация.
Исключителдьные ситуации также можно описать в описании функции. В любом случае есть гарантия, что ошибка будет замечена. Либо вызывающая функция ожидает данную исключительную ситуацию как возможный вариант исхода (try catch), либо нет — тогда тем более надо бить в колокола. Использовать коды возврата я бы рекомендовал только в случае предупреждающих ошибок. Аналог — warning-и компилятора. Хочешь показывай, хочешь — нет. Хочешь — останавливай компиляцию, хочешь — нет. В случае же ошибок надо обязательно "крикнуть". Гарантировано заметят, а следовательно ты избежишь незамеченных ошибок, а следовательно глюков программ.
Кстати, можно переопределить terminate с тем, чтобы показывать полную информацию о том, что же произошло. Я так обычно и делаю. Результат — если что-то идет не так, я точно знаю что и где.
Здравствуйте, dkon, Вы писали:
D>Здравствуйте, Кодт, Вы писали:
К>>ATLASSERT( SUCCEEDED( hr = pObj->Play( taram param ) ) );
D>кое-где за такое могут и уволить профи должен знать, что случается с ассертом и выражением внутри него в релизе.
Ой-бояй! Это у меня руки быстрее головы сработали.
Конечно, там должен быть VERIFY( .... )
Здравствуйте, menify, Вы писали:
M>Здравствуйте, template, Вы писали:
M>Исключения это вообще единственный надежный способ вернуть ошибку произошедшую в конструкторе (согласно Страуструпу же).
Как вам уже написали, лучше инициализацию проводить не в конструкторе, а в отдельном методе.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, skyline, Вы писали:
S>Во первых, вы используете разновидность GoTo, а это очень плохой оператор, WH>Причем тут goto? Исключение разматывает стек.
Я имею в виду, что
по сути, одно и тоже, а в обоих случаях программа становится плохо читаемой
можно привести подобный пример с циклами, как мне сегодня писали, но циклы не нарушают логику, и являются базовым понятием теории логических схем. Если ты считаешь, что то же вено для выбросов исключений, приведи пример, как это обозначается на логической схеме алгоритма.
S>Если я забуду обработать одну ошибку в функции, то у меня нарушится логика работы, и вероятно, не будет ни чего плохого, но если я забуду обработать два исключения ... WH>Да и проявлятся она будет после дождичка в четверг. Именно такие ошибки труднее всего поймать, а если у тебя рухнула программа то ты покрайней мере будешь знать что она есть. А если это произошло под отладчиком то еще будешь знать где именно.
Я плохо выразил свою мысль. Если у меня в проге редкая ошибка, то в первом случая прога будет падать по крайне мерее не сразу, а по моему опыту, лучше уж, если у клиента программа работает не правильно, чем падает с сообщением Windows
S>Так что уж лучше без них. WH>Нетуж лучше с ними.
Сколько людей, столько и мнений.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, Slick
S>Какими критериями руководствоваться при решении такой задачи? S>Или может быть нужен в корне другой подход?
Если я правильно понял, вы спрашиваете, как групировать исключительные ситуации?
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, skyline, Вы писали:
S>Здравствуйте, Slick
S>Какими критериями руководствоваться при решении такой задачи? S>Или может быть нужен в корне другой подход? S>Если я правильно понял, вы спрашиваете, как групировать исключительные ситуации?
Здравствуйте, Slick, Вы писали:
S>Коллеги, хотелось бы поднять тему обработки исключений в С++ приложениях. S>При разработке системы отслеживания и обработки ошибок в объектно-ориентированном приложении порою сталкиваешься с дилемой: какой подход и в каком случае применять для решения этих задач. Фактически речь идет о выборе между отлавливанием через try-catch, предпологающим написание классов исключений и обычным анализом возвращаемого статуса выполнения. Кто чем пользуется и в каких случаях пользуется?
Здравствуйте, Slick, Вы писали:
S>Здравствуйте, skyline, Вы писали:
S>Здравствуйте, Slick
S>Какими критериями руководствоваться при решении такой задачи? S>Или может быть нужен в корне другой подход? S>Если я правильно понял, вы спрашиваете, как групировать исключительные ситуации?
S>Да, именно так.
S>Просто интересно свежее мнение на эту тему.
Моё мнение таково — существуют 4 вида исключительных ситуаций
1 Не критические ситуации
2 Критические ошибки — программу надо срочно сворачивать, дальше работать нет смысла
3 Программисткие ошибки — только на этапе разработки
4 Ошибки какой-то внешней среды
If the milk turns out to be sour,
I ain't the kind of pussy to drink it