Идеология С++ и warnings

Dimitry Sibiryakov
Дата: 27.01.2015 14:34:12

Насколько я понимаю, идеология С++ гласит, что в ошибочных ситуациях из функций должны
выкидываться исключения, которые потом ловятся и обрабатываются. А что делать с
предупреждениями? Неужели, как и в С, проверять их наличие после каждого вызова?

Posted via ActualForum NNTP Server 1.5

egorych
Дата: 27.01.2015 15:25:46
Dimitry Sibiryakov, чем отличаются предупреждения от ошибок, на твой взгляд?
Anatoly Moskovsky
Дата: 27.01.2015 15:38:30
Dimitry Sibiryakov
Насколько я понимаю, идеология С++ гласит, что в ошибочных ситуациях из функций должны
выкидываться исключения, которые потом ловятся и обрабатываются. А что делать с
предупреждениями? Неужели, как и в С, проверять их наличие после каждого вызова?

Нет никакой единой идеологии С++.
Кто не хочет, может не использовать исключения.
То же самое с классами и шаблонами.
В этом и суть мультипарадигменности С++.

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


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

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


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


Какие предупреждения ты имеешь в виду ?
Во время компиляции которые ?
mayton
Дата: 27.01.2015 16:52:31
Dimitry Sibiryakov
проверять их наличие после каждого вызова?

Не понял о чём Дмитрий толкует. Что можно проверять после каждого вызова?
Это что Ассемблер?
Dimitry Sibiryakov
Дата: 27.01.2015 19:43:05

MasterZiv
Какие предупреждения ты имеешь в виду ?

Вот, например, ODBC API. К нему есть некоторая обёртка. Для простого SQL_ERROR эта
обёртка, ясное дело, выкидывает исключение с текстом ошибки внутри. Обработка SQL_SUCCESS
- тоже простая вещь. А вот что делать когда функция ODBC возвращает SQL_SUCCESS_WITH_INFO
- я в непонятках.

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

Posted via ActualForum NNTP Server 1.5

Anatoly Moskovsky
Дата: 27.01.2015 19:55:45
Dimitry Sibiryakov,

"Информация" должна возвращаться явно, а ошибки - через исключения.
try {
  info res = stmt.execute();
  if (res.has_warnings())  
     logger.warn(res.text());
}
catch (sql_error e) {
     ...
}
Dimitry Sibiryakov
Дата: 27.01.2015 20:00:16

Anatoly Moskovsky
"Информация" должна возвращаться явно, а ошибки - через
исключения.

Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
string ODBCDataSet.getAsString(int FieldNo)

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

Posted via ActualForum NNTP Server 1.5

Anatoly Moskovsky
Дата: 27.01.2015 20:35:39
Dimitry Sibiryakov
Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы".

Зачем проверять при каждом вызове, если это не ошибки?
Сделайте так чтобы можно было проверять по желанию.

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

Вместо string возвращайте обертку, которая неявно приводится к string и имеет метод для извлечения дополнительной инфы.
Если юзер захочет проверку то он присвоит результат в тип обертки. А не захочет - сразу в строку.
Вася Уткин
Дата: 27.01.2015 22:35:10
Dimitry Sibiryakov
Anatoly Moskovsky
"Информация" должна возвращаться явно, а ошибки - через
исключения.

Тогда у функции придётся предусматривать два выхода, да ещё и проверять результат ри
каждом вызове, а это "не С++ методы". Вот, например, метод
string ODBCDataSet.getAsString(int FieldNo)

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

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


Но лучше:
Anatoly Moskovsky
Вместо string возвращайте обертку, которая неявно приводится к string и имеет метод для извлечения дополнительной инфы.