Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / C++ |
![]() ![]() |
Топик располагается на нескольких страницах: 1 2 3 [все] |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
bool Book::Save(inst::Abstract *top, const QString &full_path, QString *err) { QSaveFile out(full_path); out.open(QIODevice::WriteOnly | QIODevice::Truncate); QXmlStreamWriter xml(&out); WriteStartDocument(xml); top->Write(xml); xml.writeEndDocument(); const bool ok = out.commit(); if (!ok && err != nullptr) *err = QString("Failed to save as ") + full_path; return ok; } https://github.com/f35f22fan/Ods2/blob/master/ods/Book.cpp Вывод ошибок не параметром метода какие есть варианты? Я понимаю что try в плюсах не приветствуется. А так был бы вариант |
2 фев 21, 23:15 [22273523] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Кем не приветствуется? Не знаю как у Qt, а выкинуть std::runtime_error в данном случае вполне нормальная идея. Posted via ActualForum NNTP Server 1.5 |
||
2 фев 21, 23:26 [22273534] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2850 |
Русский язык. 9 класс. Учебник
LOL. Язык программирования С++. Бьерн Страуструп
Тут я привёл целых два и не варианта, а два обязательных направления. ![]() PS: Я удивлён, что тебя поняли, потому что без коммента от Сибирякова я вообще не уразумел о чём ты пишешь. Сообщение было отредактировано: 2 фев 21, 23:32 |
||||||||||||
2 фев 21, 23:37 [22273538] Ответить | Цитировать Сообщить модератору |
White Owl Member Откуда: Сообщений: 12678 |
Qt может не кидать исключений - это да. И если следовать этой традиции (именно традиции "Qt без исключений"), то параметр QString *err это вполне нормально и кошерно. А если собрать Qt с исключениями, то будешь себе try-catch писать вполне стандартно, традиционно и по учебнику. Там конечно свои потенциальные проблемы вылезут, которые легко решаются дисциплиной программиста, но... Поэтому чаще всего Qt и живет без исключений. А варианты правильной работы и потенциальные проблемы читать тут: https://doc.qt.io/qt-5/exceptionsafety.html |
||||
3 фев 21, 00:04 [22273540] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Поскольку он может собираться как динамическая библиотека - лучше ему этого не делать. Иначе всё становится очень сложно. Posted via ActualForum NNTP Server 1.5 |
||
3 фев 21, 01:20 [22273570] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
petrav, Не удивительно что не понял. Ты не работал с другими ЯП и вопросами по архитектуре. Задай, уточняй, это форум. |
3 фев 21, 07:00 [22273609] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Qt может работать с исключениями, но - читал мнение самих разрабов что это не в приоритете. - они не выходят сами на уровень Application. Без перехвата руками на самом верху. - через либу *.so не переходят. Если не перехватить то молча все проглотится. В общем коряво. Если в плюсах std::runtime_error многие применяют, то могу попробовать. |
3 фев 21, 07:09 [22273611] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Давайте сначала обзор вариантов. На вскидку придумал 3: 1. Глобальная переменная error 2. LastError WinApi 3. Логгер |
3 фев 21, 07:14 [22273612] Ответить | Цитировать Сообщить модератору |
crutchmaster Member Откуда: оттуда. Сообщений: 2235 |
Всё плохо. Возвращай { ret, err } как в гошечке. Сообщение было отредактировано: 3 фев 21, 07:21 |
||||
3 фев 21, 07:28 [22273613] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Dimitry Sibiryakov, >Кем не приветствуется? ==
21896029 |
||
3 фев 21, 07:32 [22273614] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
crutchmaster, Гошечку не знаю. В яве, дельфи, шарпе проблем нет. |
3 фев 21, 07:33 [22273615] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
http://nomatter.ru/ru/qtconcurrent_and_exceptions |
||
3 фев 21, 08:01 [22273620] Ответить | Цитировать Сообщить модератору |
crutchmaster Member Откуда: оттуда. Сообщений: 2235 |
Я уже вижу как минимум одну проблему - многопоток, который будет затирать твой глобальный error. Логер - я хз, как ты будешь вылавливать из него исключения, а винапи - это вообще пошлятина, да и по сути тоже, что и глобальный error. Сообщение было отредактировано: 3 фев 21, 10:13 |
||||
3 фев 21, 10:18 [22273657] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
crutchmaster, Да. Про потоки, то тут одинаковые подходы с другими ЯП. Перехват внутри потока. Хотя, в шарпе с async await ловится снаружи try { listTree = await obj.getAsync(.... |
3 фев 21, 10:40 [22273666] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
crutchmaster, >Логер - я хз, как ты будешь вылавливать из него исключения, == метод логгера это вместо stringErrOut = sssssss Писать log.add(“xml атрибут аааааа не заполнен .. То есть исключений не будет вообще. |
3 фев 21, 10:59 [22273685] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
crutchmaster, Цель двоякая при парсинге xml - остановить если критическая ошибка типа версия не та - пройти весь файл документ и вывалить юзверю ошибки шаблона документа Договор или Накладная или... |
3 фев 21, 11:02 [22273689] Ответить | Цитировать Сообщить модератору |
AmKad Member Откуда: Сообщений: 5250 |
|
||||||
3 фев 21, 11:25 [22273711] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
AmKad, Там по ссылке ниже код приведен. Что одно от другого зависит. Формально слова разные. А логика кода вывернута шиворот навыворот. Разные концепции. Мне жаль. |
3 фев 21, 11:40 [22273722] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50968 |
Топик будет не полным пока мы не обсудим costs на обработку exception. В сравнении с возвратом boolean. |
3 фев 21, 12:30 [22273746] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
mayton, Угу. Сишникам только дай про скорость поговорить)))) |
3 фев 21, 12:48 [22273757] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
mayton, Boolean нужен только при первом случае выше. А случаев два штуки. |
3 фев 21, 12:49 [22273759] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50968 |
Если язык и библиотеки рекомендуют использовать исключения (Java/C#) для обработки непредвиденных ошибок - то надо использовать. Более того. Во многих языках с управляемой кучей процесс обработки ошибки тестно завязан на корректное освободждение ресурсов. Насчет С++ - сложно сказать является ли это общеупотребимой практикой. Это интересный вопрос. И почему например при создании GoLang полностью отказались от механизма исключений. И на что заменили. Тоже вопрос достойный обсуждения. |
3 фев 21, 12:59 [22273765] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2850 |
В С++ как обычно бардак, раздрай и подводные камни. Примерно как со строками. Программируя на Qt, конечно, можно использовать исключения. И в случае DLL тоже, но нужно уметь обходить подводные рифы. |
||||
3 фев 21, 13:09 [22273768] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Всё перечисленное - языки программирования. Qt - фреймворк (библиотека). Почувствуй разницу. PS: Повторяю медленно: в библиотеке Qt исключения не приветствуются по вполне определённой причине - возможности динамической сборки. В языке программирования С++ с исключениями проблем нет. Сообщение было отредактировано: 3 фев 21, 14:01 |
||
3 фев 21, 14:00 [22273850] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Dimitry Sibiryakov, Теорию я понял. Теперь по коду и практике. Выше ссылка как пишут с try в других ЯП. |
3 фев 21, 14:24 [22273872] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Ссылку на доку Qt - вижу. Ссылку на то почему в C++ не нужно finally - вижу. Не вижу ссылки на то "как пишут с try в других ЯП". Posted via ActualForum NNTP Server 1.5 |
||
3 фев 21, 14:33 [22273887] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2850 |
Скорее Qt не работает с исключениями по историческим причинам. Когда они начинали разрабатывать Qt исключений в языке не было. Так и пошло... Или по идеологическим причинам, например, считают, что исключения делают разработку сложной, а программы ненадёжными. |
||||
3 фев 21, 14:46 [22273910] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Или просто не смогли решить главную (и единственную) проблему исключений (не зависящую от ЯП) - совпадение системы исключений, RTTI и RTL на всём call stack от места, где оно выкидывается, до места, где оно ловится. Posted via ActualForum NNTP Server 1.5 |
||
3 фев 21, 14:51 [22273920] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Dimitry Sibiryakov, 21896099 try и финализация работают совместно и Удобно. |
3 фев 21, 15:08 [22273956] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2850 |
Вопрос совместимости. Если Qt собрано на VS 2017, а приложение на VS 2019, то будут ли проблемы? Я уверен (почти) что нет. Проблем особых я не вижу. Точнее проблема только одна: Qt перестаёт развиваться и мы просто не можем его пересобрать под новый компилятор. |
||||||
3 фев 21, 15:08 [22273957] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
petrav, Либы не нужно собирать в операционке. Ставить бинарниками. |
3 фев 21, 15:10 [22273960] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Ровно до момента, когда финализируемых объектов становится больше одного. RAII всё же удобнее, как и прочие умные указатели.
В тобой процитированном точно названы три условия. Ты не в состоянии проследить их выполнение? Тогда считай, что оно работать не будет, ибо в противном случае ты получишь зависимость поведения своей программы от погоды на Марсе. Posted via ActualForum NNTP Server 1.5 |
||||
3 фев 21, 15:25 [22273992] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50968 |
Тут по логике надо проверить что open успешен. Вроде он тоже bool возвращает. Fail-fast. Сообщение было отредактировано: 3 фев 21, 15:25 |
||||
3 фев 21, 15:32 [22274009] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Dimitry Sibiryakov, >Ровно до момента, когда финализируемых объектов становится больше одного. RAII всё же удобнее, как и прочие умные указатели. ==возможно. Только умные указатели для технической сборки мусора это одно (проще). А для логики программного кода.... Ветвления.... Другое. Я предпочитаю руками это творить (с) )))) |
3 фев 21, 15:45 [22274033] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52888 |
Значит твой путь - возвращение текста ошибок через параметр руками. Вот и ответ на вопрос топика. Posted via ActualForum NNTP Server 1.5 |
||
3 фев 21, 15:53 [22274049] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Неа. Мы видели "жизнь других". Попробую класс Qt и класс std. Отпишусь. |
||||||
3 фев 21, 17:07 [22274145] Ответить | Цитировать Сообщить модератору |
bk0010 Member Откуда: Сообщений: 5053 |
|
||||
3 фев 21, 22:08 [22274376] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Подскажите как работать с исключениями в студии. Нужен в отладке вывод номера строки кода где оно происходит или остановка ide на этой строке. Если исключение обернуто try то ide не останавливается. Если смотреть output то там нет номера строки. Может как добавить в e.what() но не понял как сделать. Студия 2015 может что с этим сделать? |
7 апр 21, 15:11 [22305452] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Хочется к в дельфи или вебсервере. В дельфи открывается редактор на строке с райзе. В веб серверах есть лог с подробнейшей инфой. |
7 апр 21, 15:22 [22305460] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Вот что выяснил. Если исключение я генерю сам, то появляется окно ![]() и редактор показывает строку с исключением. Если исключение в string.replace( index - 1 То окно уже не студии а C++ runtime library Исключение внутри dll и программа завершается. Отладка не работает. Почему? |
7 апр 21, 16:39 [22305528] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Отчасти решено)) Надо вкл галку Options - Enable Just My Code )) Тогда студия не уходит в недра своего кода глубоко. |
7 апр 21, 16:58 [22305546] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34684 |
чё за бред то? |
||||
7 апр 21, 23:15 [22305730] Ответить | Цитировать Сообщить модератору |
petrav Member Откуда: Сообщений: 2850 |
Это PetroNotC Sharp. ![]() |
||||||||
7 апр 21, 23:21 [22305734] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34684 |
В самом Qt нет исключений, причём ясно, по какой причине: библиотека возникла, когда исключений в С++ ещё не было. И в дальнейшем отказ от исключений в самом Qt тоже решили сохранить -- так фреймворк может использоваться в любых приложениях, с включёнными исключениями и с выключенными. Но использовать исключения в приложениях на Qt никто никогда не запрещал, используйте на здоровье! |
||||
7 апр 21, 23:23 [22305736] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34684 |
Так ловить надо исключения, если их используешь... |
||||
7 апр 21, 23:26 [22305740] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
std:string.begin() выход за диапазон } catch(три точки) А когда поймал надо вывод номера строки кода. Ну или стек по желанию. Сообщение было отредактировано: 8 апр 21, 07:46 |
||||||||
8 апр 21, 07:45 [22305777] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Их не запрещают. На них просто забили))) Поддержка в одном классе на задворках. Весь топик об этом говорили. Нельзя сделать и так и эдак да еще с удобствами“ |
||||||||
8 апр 21, 07:59 [22305779] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Я не спец. Возможно оператор noexcept повлиял в моем случае. Чего только не придумают))) https://coderoad.ru/33210169/Как-использовать-noexcept-в-C-или-как-это-работает |
8 апр 21, 09:09 [22305796] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Смешно. |
||
8 апр 21, 09:14 [22305799] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
Подскажите галочку в студии. Я запускаю F5 во время написания кода. Консольное. Если есть ошибка, то все равно запускается "прошлая" версия. Приходится сначала F6 и потом F5. Надоедает. Как тут автоматом? Как в дельфи)) |
8 апр 21, 15:20 [22306017] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
petrav, Ну вот этот то вопрос выше тебе понятен?))) |
8 апр 21, 15:48 [22306031] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
MasterZiv, Хотелось как в шарпе ex.Message ex.Data[метка ex.innerException ex.ToString ex.распечатайСтек |
8 апр 21, 15:57 [22306040] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1941 |
У вас, товарищ, кашка в головушке. Где это я писал, "что исключения не приветствуются"? |
||||||
8 апр 21, 17:39 [22306100] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1941 |
Вот чума. Потому что ты, получив сообщение об ошибках сборки и предложении запустить последнюю успешную, не только нажал "Да", но и установил флажок "больше не показывать". F10->Tools -> Options -> Project and Solutions -> Build and Run К сообщению приложен файл. Размер - 27Kb |
||||
8 апр 21, 17:59 [22306111] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
|
||||||||
8 апр 21, 18:12 [22306118] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1941 |
Зависит от того, куда эти ошибки после. Мне лично нравится именно такой вариант, как в твоем коде. Про исключения тут уже говорили, тоже использую. Ещё - в одном моем проекте есть централизованный "диспетчер ошибок". Представляет собой сервер (в отдельной нити), просто слушающий сокет. То есть, сервер, просто принимающий сообщения и отправляющий их куда и кому надо (в лог, в графическую подсистему, по tcp кому-то), фактически актор. "Сообщения" - это сообщения zeromq, летающие через zmq - сокеты с использованием iproc - протокола (т.е., не tcp/не в сети). Протокол inproc - зверски быстрый, не использует сеть, позволяет общаться между нитями внутри процесса. То есть, получается примерно тот же throw, но с перехватом в одном месте. |
||||
8 апр 21, 18:25 [22306123] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50968 |
Тут скорее всего речь идет не о перехвате. А о журналировании событий. В точке где возникло исключение вы уже ничего не перехватили и принять решение никакое там уже не сможете. |
||||
8 апр 21, 18:58 [22306137] Ответить | Цитировать Сообщить модератору |
PetroNotC Sharp Member Откуда: Сообщений: 7558 |
ъъъъъ, В линукс админы давно разделили. Приложение пишет в лог. А потом отдельные совершенно админские штучки читают эти логи, пакуют, агрегируют, анализируют и отправляют куда надо. Разделение труда. |
8 апр 21, 19:08 [22306144] Ответить | Цитировать Сообщить модератору |
ъъъъъ Member Откуда: Сообщений: 1941 |
Ну, диспетчер сообщений может и решение принять. Правда, на "глобальном" уровне. Я и написал - способ обработки зависит от того, что с самим фактом ошибки нужно делать. |
||||||||
8 апр 21, 19:11 [22306145] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: 1 2 3 [все] |
Все форумы / C++ | ![]() |