powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идеология С++ и warnings
25 сообщений из 34, страница 1 из 2
Идеология С++ и warnings
    #38864283
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, идеология С++ гласит, что в ошибочных ситуациях из функций должны
выкидываться исключения, которые потом ловятся и обрабатываются. А что делать с
предупреждениями? Неужели, как и в С, проверять их наличие после каждого вызова?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864406
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, чем отличаются предупреждения от ошибок, на твой взгляд?
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864427
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНасколько я понимаю, идеология С++ гласит, что в ошибочных ситуациях из функций должны
выкидываться исключения, которые потом ловятся и обрабатываются. А что делать с
предупреждениями? Неужели, как и в С, проверять их наличие после каждого вызова?
Нет никакой единой идеологии С++.
Кто не хочет, может не использовать исключения.
То же самое с классами и шаблонами.
В этом и суть мультипарадигменности С++.

Касательно того в каких случаях бросать исключения а в каких возвращать код, то по этой теме столько же мнений сколько людей ))
Я лично применяю такой подход.
Если задача функции выполнить некое действие, то она бросает исключение если не смогла его выполнить.
Если же задача - произвести проверку, то результат проверки возвращается кодом (bool, int).
Понятно что второе это частный случай первого. Если проверку не удалось произвести то бросается исключение.
Никакого деления на ошибки и предупреждения не требуется.
Предупреждения просто логируются и не влияют на ход выполнения алгоритма.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864484
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНасколько я понимаю, идеология С++ гласит, что в ошибочных ситуациях из функций должны
выкидываться исключения, которые потом ловятся и обрабатываются.


В С++ нет какой-то общей идеологии. В каждом API или библиотеке программисты
сами договариваются и устанавливают себе стандарты поведения.

Но если это действительно функция (не void) и ей дейтвительно нечего вернуть,
(как например при делении на 0), то да, в таких ситуациях очень правильно выкидывать
исключение.


Dimitry Sibiryakov А что делать с
предупреждениями? Неужели, как и в С, проверять их наличие после каждого вызова?


Какие предупреждения ты имеешь в виду ?
Во время компиляции которые ?
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864551
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovпроверять их наличие после каждого вызова?
Не понял о чём Дмитрий толкует. Что можно проверять после каждого вызова?
Это что Ассемблер?
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864757
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКакие предупреждения ты имеешь в виду ?
Вот, например, ODBC API. К нему есть некоторая обёртка. Для простого SQL_ERROR эта
обёртка, ясное дело, выкидывает исключение с текстом ошибки внутри. Обработка SQL_SUCCESS
- тоже простая вещь. А вот что делать когда функция ODBC возвращает SQL_SUCCESS_WITH_INFO
- я в непонятках.

Этот код возвращается в куче ситуаций, причём в большинстве они специфичны для СУБД, то
есть "generic" обработчик их невозможен. MS SQL, например, имеет привычку играть в КО и
возвращать "информацию" типа "успешно соединились с базой такой-то". На другом конце палки
- "предупреждение" типа "данные были усечены при доставке", игнорировать которое чревато
боком.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864767
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

"Информация" должна возвращаться явно, а ошибки - через исключения.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
try {
  info res = stmt.execute();
  if (res.has_warnings())  
     logger.warn(res.text());
}
catch (sql_error e) {
     ...
}
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864772
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky"Информация" должна возвращаться явно, а ошибки - через
исключения.
Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
Код: sql
1.
string ODBCDataSet.getAsString(int FieldNo)


Если ему прикручивать дополнительный статусный выход, получится коряво.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864800
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы".
Зачем проверять при каждом вызове, если это не ошибки?
Сделайте так чтобы можно было проверять по желанию.

Вообще это надо решать в каждом случае отдельно.
Например,
Код: plaintext
1.
string ODBCDataSet.getAsString(int FieldNo)


Вместо string возвращайте обертку, которая неявно приводится к string и имеет метод для извлечения дополнительной инфы.
Если юзер захочет проверку то он присвоит результат в тип обертки. А не захочет - сразу в строку.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864861
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAnatoly Moskovsky"Информация" должна возвращаться явно, а ошибки - через
исключения.
Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
Код: sql
1.
string ODBCDataSet.getAsString(int FieldNo)


Если ему прикручивать дополнительный статусный выход, получится коряво.

Самое простое:
Код: sql
1.
std::pair<string, string> ODBCDataSet.getAsString(int FieldNo);



Но лучше:
Anatoly Moskovsky Вместо string возвращайте обертку, которая неявно приводится к string и имеет метод для извлечения дополнительной инфы.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864871
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иех вы.... люди ушибленные С++.
Исключения это изначально дурная идея, не имеющая ни одного полезного свойства. В учебнике написано что исключения это здорово и вы поверили. А теперь пытаетесь с ними работать.
Мне вас жаль.
Но вы этого поста не поймете. Потому что верите учебникам и различным гуру от "С++ за 21 день" которые задурили вам головы.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864880
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткинлучше
Но возникает вопрос как узнать, что дополнительную инфу нужно получать. Простейший пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
try
{
   a = ds.getAsString(1);
   b = ds.getAsString(2);
   c = ds.getAsString(3);
}
catch(...)
{ ... }


Ошибки сами прилетят в обработчик, а вот остальное. Не писать же дебильное
Код: sql
1.
if (a.hasWarnings() || b.hasWarnings() || c.hasWarnings()) ...


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864907
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОшибки сами прилетят в обработчик, а вот остальное. Не писать же дебильное
Код: sql
1.
if (a.hasWarnings() || b.hasWarnings() || c.hasWarnings()) ...


Вся проблема в том что вы зачем то вообще хотите возвращать эти предупреждения.
А их надо обрабатывать прямо по месту их обнаружения (например путем логирования).
Если от наличия предупреждения меняется нормальный ход программы, то это должно быть исключение. А если не меняется, то вызывающему коду вообще не нужно о них знать.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864911
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Аминь.
А теперь по делу давайте ))
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864912
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнительную информацию можно получать через событие.
То есть при обращении к getAsString основную информацию получаем как возвращаемое значение. При этом возбуждается событие, и если мы на него подписаны - в обработчике юзаем дополнительную инфу.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864929
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как из рекурсии наверх выскочить? Best practices.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864977
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owl,

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

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

Да даже подумать слегка: если произошло исключение значит что-то где-то упало. Мы пишем программы чтобы они работали и не падали. Значит исключений быть не должно. Но с упорством достойным лучшего применения люди придумывают себе головную боль работы с исключениями. С тем чего быть не должно. Идиотизм чистейший.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38864992
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
исключения бростать только в драйверах и ловить тока вокруг вызовов стороних библиотек.
Во всех остальных случаях дурного тона.

Даже в Microsoft наконец от этого вылечились кидать exceptins по любому поводу
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865002
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДа даже подумать слегка: если произошло исключение значит что-то где-то упало
Ну вот, человек даже не понимает сути механизма исключений, но зато уверен что они зло ))
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865004
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikДаже в Microsoft наконец от этого вылечились кидать exceptins по любому поводу
Проблема с неверным применением исключений возникает не из-за кидания по любому поводу, а из-за ловли по любому поводу ))

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
do_а()
{
   a1();
   a2();
   a3();
}
do_b()
{
...
}

do_c()
{
...
}

run()
{
   do_a();
   do_b();
   do_c();
}

task()
{
   try {
      run();
   }
   catch () {
      // decide: rerun or fail
   }
}


С исключениями, если ловить их на правильном уровне абстракции такой код получается чистый и лаконичный.
С кодами возврата, каждый вызов на каждом уровне вложенности получается обернут в проверки этих кодов, которые 1) засоряют текст, затрудняя понимание алгоритма. 2) можно забыть поставить и ошибка не будет обработана.
Таким образом исключения - зло, только для тех кто не умеет их применять (ловит их как коды возврата - на каждом уровне абстракции). Для всех остальных - они на порядки упрощают написание и сопровождение кода.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865260
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivКакие предупреждения ты имеешь в виду ?
Вот, например, ODBC API. К нему есть некоторая обёртка. Для простого SQL_ERROR эта
обёртка, ясное дело, выкидывает исключение с текстом ошибки внутри. Обработка SQL_SUCCESS
- тоже простая вещь. А вот что делать когда функция ODBC возвращает SQL_SUCCESS_WITH_INFO
- я в непонятках.

Этот код возвращается в куче ситуаций, причём в большинстве они специфичны для СУБД, то
есть "generic" обработчик их невозможен. MS SQL, например, имеет привычку играть в КО и
возвращать "информацию" типа "успешно соединились с базой такой-то". На другом конце палки
- "предупреждение" типа "данные были усечены при доставке", игнорировать которое чревато
боком.


Ну, я делал "обёртки" над ODBC и OpenClient, надо сказать, что во-первых, эта штука достаточно специфическая,
и далеко не в каждой библиотеке есть такие "проблемы".
( Кстати, хорошо, что ты сразу привёл конкретную ситуацию, а то гадали бы 10 лет ещё.)

Во-вторых, обработка таких штук выходит за рамки языка С++ как такового, это уже логика работы конкретных библиотек.
Ну и соответственно, решать их надо не на уровне языка, а на уровне библиотек и их организаций.

Конретно тут я бы сделал (а когда я это делал, я именно так и реализовывал) интерфейс (pattern Bridge) для обработки ошибок и предупреждений (в общем это называется "сообщения") со стороны БД, а затем бы реализовал дефолтную реализацию данного интерфейса для всех (и возможно для каждой СУБД в отдельности, если есть разные СУБД), которая бы обрабатывала ошибки
и предупреждения и прочие сообщения (кстати, есть и просто сообщения, это в том же MSSQL/Sybase всё, что пишет оператор print на серверной стороне), и, возможно, в каких-то случаях генерировала бы исключения, в каких-то может быть писала бы в лог и т.п.
Кроме этого, естественно, надо дать возможность пользователю переопределять этот обработчик сообщений, а также задать
по умолчанию дефолтный обработкик, предоставляемый библиотекой, при создании соединения с БД (как правило, обработка ошибок специфична именно для соединения).

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

Также некоторые ошибки и сообщения должны приводить к повторению выполнения запроса ( дедлоки, перекомпиляция пакета в Oracle), а некоторые -- к пересозданию соединения с БД (если библиотека конечно это поддерживает, а хорошая -- я считаю -- обязана).
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865264
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Этот код возвращается в куче ситуаций, причём в большинстве они специфичны для СУБД, то
есть "generic" обработчик их невозможен.



Сори, хочу подчеркнуть отдельно.
Ну так тогда очевидно напрашивается дефолтная реализация обработчика для всех СУБД,
и её наследники -- реализации для конкретных СУБД, а также возможность для пользователя задать свой
собственный обработчик.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865267
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly Moskovsky"Информация" должна возвращаться явно, а ошибки - через
исключения.
Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
Код: sql
1.
string ODBCDataSet.getAsString(int FieldNo)


Если ему прикручивать дополнительный статусный выход, получится коряво.


У меня в библиотеках было три выхода из запроса:
наборы данных

выходные параметры

диагностика (набор сообщений от СУБД)

Я считаю, что это -- самый правельный подход.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865273
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИех вы.... люди ушибленные С++.
Исключения это изначально дурная идея, не имеющая ни одного полезного свойства. В учебнике написано что исключения это здорово и вы поверили. А теперь пытаетесь с ними работать.
Мне вас жаль.
Но вы этого поста не поймете. Потому что верите учебникам и различным гуру от "С++ за 21 день" которые задурили вам головы.

Твои экстремистские взгляды всем известны и малоинтересны (извини).
На самом деле, если ты подумаешь, то поймёшь, что исключения придуманы не в С++, они были с самого рождения ЭВМ.
Деление на 0 -- самый яркий пример.

Да, и исключения -- это не способ принести пользу, это способ не принести вред.
Так что все рассуждения о пользе бессмысленны

(только прошу тему не развивать, или в отдельном треде).
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865275
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВася Уткинлучше
Но возникает вопрос как узнать, что дополнительную инфу нужно получать. Простейший пример:



А никак не надо. Надо просто всегда эту доп. инфу возвращать, и всё.
Возможно, она будет в 90% пустая -- ну и не страшно.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идеология С++ и warnings
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]