![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
SABROG |
![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Сама библиотека Qt практически не использует исключения за исключением QtXmlPatterns и QtConcurrent, но никто не запрещает использовать их в твоей программе. Но я думаю будет полезным ознакомится с общим, не хорошим, мнением об исключениях.
|
|
|
![]() |
Tonal |
![]()
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
2 SABROG Может опишешь это "общее мнение"?
А то не понятно о чём ты... |
|
|
SABROG |
![]()
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
2 SABROG Может опишешь это "общее мнение"? А то не понятно о чём ты... http://google-styleguide.googlecode.com/sv....xml#Exceptions |
|
|
kwisp |
![]()
Сообщение
#4
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
SABROG,
полезная ссылка(Google C++ Style Guide). ознакомится с мнением экспертов неплохо ![]() Сообщение отредактировал kwisp - 23.9.2009, 8:50 |
|
|
BRE |
![]()
Сообщение
#5
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
На мой взгляд, ключевая фраза там:
Цитата Because most existing C++ code at Google is not prepared to deal with exceptions, it is comparatively difficult to adopt new code that generates exceptions. На сколько я понял эту фразу переведенную электронным переводчиком, основная масса Гугловского кода не заточена для работы с исключениями, поэтому они не рекомендуют их использовать. Но это проблемы самого Гугла. Исключения - штатное средство C++ и ограничивать себя в их использовании, IMHO, это шагать назад. Опять же IMHO, исключения позволяют улучить читабельность исходного кода и позволяют генерировать более оптимальный код. Примеры: * Исключение в конструкторе. Сразу дает понять, что объект не может быть сконструирован. Нет нужды вводить флаги valid для объектов и проверять их во всех местах и не нужно вводить новые методы типа bool init(), которые по сути замещают конструктор и делают конструирование объекта двух-этапным. * Проверка результата работы функции. Нет необходимости после каждой функции вставлять проверку результата ее работы, что только затрудняет чтение и делает множество точек выхода из функции по ошибке. Для эффективного и безопасного использования исключений нужно один раз разобраться с их тонкостями и хорошо продумывать кто, где и как исключение может послать и кто/где/как эти исключения будет обрабатывать. Книг много, начиная с Страуструпа. По поводу исключений в Qt. Как мне кажется отсутствие исключений в Qt это вопрос больше исторический. В те времена когда началась разработка Qt на некоторых платформах были проблемы при использовании исключений (о чем они и пишут), поэтому ребята решили отказаться от их использования для возможности использовать Qt на большем числе платформ. Сейчас ситуация изменилась, не знаю остались ли еще такие платформы. Поэтому, отказывать себе в использовании этого (несомненно эффективного) механизма, по моему не стоит. ![]() |
|
|
kemiisto |
![]()
Сообщение
#6
|
![]() Студент ![]() Группа: Участник Сообщений: 27 Регистрация: 5.9.2009 Из: Осло, Норвегия Пользователь №: 1054 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
На мой взгляд, ключевая фраза там: Нет. Не эта фраза там ключевая. И не одна она там. Перечислены они в cons. И всё там по делу написано. Трудно отследить управляющую логику программы, так как она будет смешана с обработкой ошибок. И как ты (ничего, что я на "ты"?) уже правильно заметил, об исключениях слишком много надо знать. Для эффективного и безопасного использования исключений нужно один раз разобраться с их тонкостями и хорошо продумывать кто, где и как исключение может послать и кто/где/как эти исключения будет обрабатывать. Книг много, начиная с Страуструпа. Книг много, да времени мало.* Исключение в конструкторе. Сразу дает понять, что объект не может быть сконструирован. Нет нужды вводить флаги valid для объектов и проверять их во всех местах и не нужно вводить новые методы типа bool init(), которые по сути замещают конструктор и делают конструирование объекта двух-этапным. Конструкторы, судя по всему, вообще зло. Надо бы фабрики классов использовать... Но для этого надо читать... Много читать. Сам никак не начну GoF. * Проверка результата работы функции. Нет необходимости после каждой функции вставлять проверку результата ее работы, что только затрудняет чтение и делает множество точек выхода из функции по ошибке. А какая разница? Нет необходимости проверять результат работы функции, но есть необходимость обрабатывать исключения, сгенерированные в процессе её работы. И да, самое главное, что в Qt исключения практически не используются. А мешать error codes и exceptions в коде - ещё хуже, чем использовать что-то одно. |
|
|
rnd |
![]()
Сообщение
#7
|
Студент ![]() Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Трудно отследить управляющую логику программы, так как она будет смешана с обработкой ошибок. Как раз наоборот, при использовании исключений логика программы и обработка ошибок, будут четко разделены. При использовании кодов после каждой функции неизбежно появление if |
|
|
SABROG |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Еще 3 вещи, которые относятся к исключениям:
- возможное замедление работы программы - увеличенное потребление памяти - увеличение размера собранной программы |
|
|
rnd |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
SABROG,
для большинства программ - это слезы а вот то, что программы с исключениями требуют более высокой культуры написания кода - это факт кстати, если вы используете raii (современный с++), то без исключений уже никак |
|
|
BRE |
![]()
Сообщение
#10
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Еще 3 вещи, которые относятся к исключениям: - возможное замедление работы программы - увеличенное потребление памяти - увеличение размера собранной программы Во времена, когда только появился C++, приверженцы C, выдвигали те-же аргументы на счет программ написанных на С++. ![]() ![]() - косвенные вызовы виртуальных методов (замедление работы программы) - таблицы виртуальных методов (увеличивается размер программы и потребление памяти) Ну как показало время, эти проблемы не такие уж и фатальные. ![]() |
|
|
SABROG |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
rnd |
![]()
Сообщение
#12
|
Студент ![]() Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
SABROG,
обязательно покажет:) |
|
|
BRE |
![]()
Сообщение
#13
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Будем надеяться, что время не покажет, что C++ с Qt - старый век, а чуть медленная Java - новый... На счет java не скажу - не знаю... А вот что C++ и Qt старый век - никто не говорит. Переделывать Qt для использования исключений это огромная и наверное не нужная работа. Библиотека сформировалась. Qt делалась без исключений не по тому что исключения вредны, а по тому что в то время когда она начинала разрабатываться на некоторых платформах, а точнее на некоторых компиляторах для этих платформ, были проблемы с исключениями. Разработчики компиляторов не смогли их победить. IMHO, если бы Qt начинала разрабатывать сейчас, возможно она бы во всю использовала исключения. |
|
|
rnd |
![]()
Сообщение
#14
|
Студент ![]() Группа: Участник Сообщений: 54 Регистрация: 22.7.2009 Пользователь №: 930 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
SABROG,
обязательно покажет:) |
|
|
Tonal |
![]()
Сообщение
#15
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: ![]() ![]() ![]() |
Я почти уверен, что если бы в компиляторе можно было бы отключать обработку шаблонов, была бы очень большая и убедительная группа людей, которая бы доказывала что их использовать нельзя, т.к они приводят к:
Цитата - возможное замедление работы программы - увеличенное потребление памяти - увеличение размера собранной программы Хорошо что такого ключика нет! |
|
|
SABROG |
![]()
Сообщение
#16
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Я вас понял. Всё, что вы мне хотите сказать "ты просто не умеешь их готовить".
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#17
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Я вижу смысл исключений только в одном, сокращение собственной ручной работы.
Предположим, что существуют 3 функции, которые сильно связаны (допустим их нужно вызывать последовательно, и каждой следующей нужно, что бы все предыдущие корректно отработали) Тогда пишим код: в случае с исключениями можно было бы эту писанину сократить: компилятор примерно тоже самое сгенерит (в зависимости от возможностей платформы)Если же нет условия, которое я перечислил в скобках, то можно поступить так:
|
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 29.6.2025, 5:46 |