powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идеология С++ и warnings
34 сообщений из 34, показаны все 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
Идеология С++ и warnings
    #38865281
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDimitry SibiryakovОшибки сами прилетят в обработчик, а вот остальное. Не писать же дебильное
Код: sql
1.
if (a.hasWarnings() || b.hasWarnings() || c.hasWarnings()) ...


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

Их надо (в библиотеке) обрабатывать и так, и так.
Потому что что-то может требовать действия и немедленной реакции, типа переконнекта или повторения запроса,
а что-то может не требовать вообще ничего, кроме печати по желанию.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865285
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikДополнительную информацию можно получать через событие.
То есть при обращении к getAsString основную информацию получаем как возвращаемое значение. При этом возбуждается событие, и если мы на него подписаны - в обработчике юзаем дополнительную инфу.

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

Ребята, давайте, если хотите о исключениях -- создайте отдельный тред для этого.
А то запутаемся тут.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865315
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу так тогда очевидно напрашивается дефолтная реализация обработчика для
всех СУБД, и её наследники -- реализации для конкретных СУБД
Останется только сущая мелочь: по поданному на вход DSN определить что за СУБД на другом
концу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865372
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОстанется только сущая мелочь: по поданному на вход DSN определить что за СУБД на другом
концу.
А вы определяйте после коннекта.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865374
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В WINAPI всё уже "украдено до нас".

Код: plaintext
1.
DWORD WINAPI GetLastError(void);



По поводу исключений С++ - давайте действительно поднимем отдельный топик.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865402
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivНу так тогда очевидно напрашивается дефолтная реализация обработчика для
всех СУБД, и её наследники -- реализации для конкретных СУБД
Останется только сущая мелочь: по поданному на вход DSN определить что за СУБД на другом
концу.


Это можно просто явно задать путём задания имени класса создаваемого соединения
и приписывания типа СУБД к имени этого класса.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865420
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно дёрнуть

Код: plsql
1.
SELECT banner from v$version;



и узнать что это Oracle или не-Oracle. Далее (ИМХО) можно наверное
дёрнуть аналогичные запросы для MySQL, MSSQL, e.t.c.
...
Рейтинг: 0 / 0
Идеология С++ и warnings
    #38865736
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо с упорством достойным лучшего применения люди придумывают себе головную боль работы с исключениями. С тем чего быть не должно. Идиотизм чистейший.Исключения упрощают обработку ошибок: основной код пишется так, как если бы "ошибок нет", а блоки перехвата "где-то отдельно" делают унифицированную обработку. Такой подход не всегда возможен, но если возможен, то код будет проще.
Другое дело, что в плюсах, как я понимаю, высокие накладные расходы на генерацию исключений и тогда некая "эмуляция на кодах возврата" может быть эффективнее.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Идеология С++ и warnings
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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