Size: a a a

2020 March 18

O

Ofee in pro.cxx
Nikolay ?
Я дал тебе  библиотеку из 20 функций которые возвращают int, и кода который их использует из 40 вызовов этих функций, где именно проверять ошибки и как?
Так, может, это тоже не самый правильный подход?
источник

K

Konstantin in pro.cxx
Ofee
Так а что делать, если хочется хоть какой-то определённости и уверенности в вызываемом коде? А если я не хочу при первом же исключении прерывать ход вычислений, я хочу как можно дольше продолжать обработку, пока это вообще возможно, чтобы показать, например, наиболее подробный лог.

Вообще, я видел TRY(error), сделанный на корутинах, кажется, что с выходом 20 стандарта, это будет первое, что я попробую)
Что аз try на корутинах?
источник

ПК

Побитый Кирпич in pro.cxx
Konstantin
А как насчёт си-библиотек, которые вызывают твои функции по указателям?
Твои функции обязаны быть помечены как noexcept, всё просто
источник

K

Konstantin in pro.cxx
Побитый Кирпич
Твои функции обязаны быть помечены как noexcept, всё просто
интересно, какая сишная библиотека накладывает такие требования?
источник

O

Ofee in pro.cxx
Побитый Кирпич
> мы можем проверять ошибки ровно там, где они реально могут возникнуть

То же самое с исключениями

>  можем даже требовать проверять возвращаемое значение

Нет, это как раз минус кодов возврата, а вот с исключениями такого нет

> приходится заботиться, а может ли тут возникнуть исключение

Об этом вообще не нужно думать если ты не в гугл. Ты не понимаешь просто как надо юзать исключения правильно
Возможно, я не пнимаю, как использовать исключения в данном случае. Но есть ещё один вариант. Что делать с асинхронным кодом? Я слабо вообще представляю, как там использовать исключения
источник

K

Konstantin in pro.cxx
Так-то можно сказать, что мои функции обязаны не содержать ошибок
источник

N?

Nikolay ? in pro.cxx
Ofee
Так, может, это тоже не самый правильный подход?
А как ещё? На этом месте обычно говорят что у них в конфлюэнсе библиотеки задокументированы и вот там вот иди и посмотри коды возвратов
источник

ПК

Побитый Кирпич in pro.cxx
Ofee
Так а что делать, если хочется хоть какой-то определённости и уверенности в вызываемом коде? А если я не хочу при первом же исключении прерывать ход вычислений, я хочу как можно дольше продолжать обработку, пока это вообще возможно, чтобы показать, например, наиболее подробный лог.

Вообще, я видел TRY(error), сделанный на корутинах, кажется, что с выходом 20 стандарта, это будет первое, что я попробую)
Как раз с исключениями у тебя появляется гарантия инвариантов, если что то выполнилось, то оно выполнилось успешно. Прерывание выполнения это БЛАГО
источник

N?

Nikolay ? in pro.cxx
Konstantin
Так-то можно сказать, что мои функции обязаны не содержать ошибок
Зачем ты пишешь функции с ошибками? )))
источник

ПК

Побитый Кирпич in pro.cxx
Если я пишу send_message_to_server(), то с исключениями я получаю гарантию, что на следующей строке сообщение отправлено
источник

ПК

Побитый Кирпич in pro.cxx
С кодом возврата я получу такую гарантию только внутри if-а
источник

K

Konstantin in pro.cxx
И в чём разница?
источник

N?

Nikolay ? in pro.cxx
Ну вот самый простой пример, OpenGL попрограммировать чуток и при ошибке любой имеем черный экран
источник

ПК

Побитый Кирпич in pro.cxx
Konstantin
И в чём разница?
В том что if не нужен, так как у меня нет тут else кейса
источник

N?

Nikolay ? in pro.cxx
и единственное спасение после каждого gl вызова ошибку проверять
источник

O

Ofee in pro.cxx
Побитый Кирпич
Из С библиотек не может вылететь исключение, иначе это гавно библиотека
Это мне известно, а авторам кода — нет, они просто все подозрительные места обложили try/catch. Потому что правильные исключения — сложно, но их нельзя как-то скрыть за красивыми интерфейсами, это то, что, независимо от своей сложности, приходится использовать в том числе и менее квалифицированным программистам, которые способны превратить кодовую базу окончательно в ад
источник

K

Konstantin in pro.cxx
Побитый Кирпич
В том что if не нужен, так как у меня нет тут else кейса
Ну так это какой-то частный кейс. А если тебе надо отправить три запроса, а потом их результаты? Будешь обкладываться try-catch?
источник

ПК

Побитый Кирпич in pro.cxx
Ofee
Это мне известно, а авторам кода — нет, они просто все подозрительные места обложили try/catch. Потому что правильные исключения — сложно, но их нельзя как-то скрыть за красивыми интерфейсами, это то, что, независимо от своей сложности, приходится использовать в том числе и менее квалифицированным программистам, которые способны превратить кодовую базу окончательно в ад
С++ в принципе сложный, это не оправдание. В msvc с EHsc флагом такие try catch тупо вырежутся, например
источник

ПК

Побитый Кирпич in pro.cxx
Konstantin
Ну так это какой-то частный кейс. А если тебе надо отправить три запроса, а потом их результаты? Будешь обкладываться try-catch?
Нет, я напишу:
const auto res1 = send1();
const auto res2 = send2();
const auto res3 = send3();
send(res1, res2, res3);
источник

ПК

Побитый Кирпич in pro.cxx
Код линейный
источник