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

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


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

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


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


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

Этот код возвращается в куче ситуаций, причём в большинстве они специфичны для СУБД, то
есть "generic" обработчик их невозможен. MS SQL, например, имеет привычку играть в КО и
возвращать "информацию" типа "успешно соединились с базой такой-то". На другом конце палки
- "предупреждение" типа "данные были усечены при доставке", игнорировать которое чревато
боком.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.01.2015, 19:55
    #38864767
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
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
27.01.2015, 20:00
    #38864772
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
Anatoly Moskovsky"Информация" должна возвращаться явно, а ошибки - через
исключения.
Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
Код: sql
1.
string ODBCDataSet.getAsString(int FieldNo)


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

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


Вместо string возвращайте обертку, которая неявно приводится к string и имеет метод для извлечения дополнительной инфы.
Если юзер захочет проверку то он присвоит результат в тип обертки. А не захочет - сразу в строку.
...
Рейтинг: 0 / 0
27.01.2015, 22:35
    #38864861
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
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
27.01.2015, 22:49
    #38864871
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
Иех вы.... люди ушибленные С++.
Исключения это изначально дурная идея, не имеющая ни одного полезного свойства. В учебнике написано что исключения это здорово и вы поверили. А теперь пытаетесь с ними работать.
Мне вас жаль.
Но вы этого поста не поймете. Потому что верите учебникам и различным гуру от "С++ за 21 день" которые задурили вам головы.
...
Рейтинг: 0 / 0
27.01.2015, 23:00
    #38864880
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
Вася Уткинлучше
Но возникает вопрос как узнать, что дополнительную инфу нужно получать. Простейший пример:
Код: 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
27.01.2015, 23:52
    #38864907
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
Dimitry SibiryakovОшибки сами прилетят в обработчик, а вот остальное. Не писать же дебильное
Код: sql
1.
if (a.hasWarnings() || b.hasWarnings() || c.hasWarnings()) ...


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

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

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

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

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

Даже в Microsoft наконец от этого вылечились кидать exceptins по любому поводу
...
Рейтинг: 0 / 0
28.01.2015, 07:04
    #38865002
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
White OwlДа даже подумать слегка: если произошло исключение значит что-то где-то упало
Ну вот, человек даже не понимает сути механизма исключений, но зато уверен что они зло ))
...
Рейтинг: 0 / 0
28.01.2015, 07:17
    #38865004
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
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
28.01.2015, 11:34
    #38865260
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
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
28.01.2015, 11:36
    #38865264
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Идеология С++ и warnings
Dimitry Sibiryakov
Этот код возвращается в куче ситуаций, причём в большинстве они специфичны для СУБД, то
есть "generic" обработчик их невозможен.



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


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


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

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

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

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

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

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

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



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


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