
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.30] |
![]() |
|
Страницы: (15) « Первая ... 5 6 [7] 8 9 ... 14 15 все ( Перейти к последнему сообщению ) |
Сообщ.
#91
,
|
|
|
Цитата amk @ Ты ведь никогда не слышал, чтобы на каждого космонавта в космос брали по 12 скафандров? Абсолютно не в курсе по сколько там берут ![]() Добавлено Хотя интересно ![]() ![]() Добавлено Погуглил, пока нашел в различных местах инфу о требовании 12-кратного запаса по прочности (истребители, канаты, альпинистское снаряжение ...), по току (регуляторы мощности) ![]() |
Сообщ.
#92
,
|
|
|
Я вот задаюсь вопросом, почему некоторые так не любят исключения. Вообще не любят. Например, их выбросили из Rust и Go. Аргументация разработчиков Go какая-то никудышная:
Цитата https://golang.org/doc/faq#exceptions We believe that coupling exceptions to a control structure, as in the try-catch-finally idiom, results in convoluted code. It also tends to encourage programmers to label too many ordinary errors, such as failing to open a file, as exceptional. Go takes a different approach. For plain error handling, Go's multi-value returns make it easy to report an error without overloading the return value. A canonical error type, coupled with Go's other features, makes error handling pleasant but quite different from that in other languages. Go also has a couple of built-in functions to signal and recover from truly exceptional conditions. The recovery mechanism is executed only as part of a function's state being torn down after an error, which is sufficient to handle catastrophe but requires no extra control structures and, when used well, can result in clean error-handling code. "Поощряет программистов считать многие обычные ошибки, таких как ошибка открытия файла, исключительными.". Такое впечатление, что в Google ошибки открытия файла - это штатная ситуация. |
![]() |
Сообщ.
#93
,
|
|
Цитата JoeUser @ Время идет, соединения нет. Как обработать исключительную ситуацию??? Обработать эксепшен в стиле "Сохранить решение для следующего обвиняемого???" Разницы нет - ассерт - эксепшен !!! Отловили ексепшн — нормально (при)остановили гильотину. Выбросился ассерт — ПО потеряло контроль над железом, гильотина пустилась в свободное плавание, КРОВЬ-КИШКИ-РАСПberry Pi. Добавлено Цитата applegame @ "Поощряет программистов считать многие обычные ошибки, таких как ошибка открытия файла, исключительными.". Такое впечатление, что в Google ошибки открытия файла - это штатная ситуация. Ошибка открытия файла — вполне себе обыденная ситуация. Не помню где, читал так же мнение, что с исключениями как-то не всё однозначно в конкуррентном коде. |
Сообщ.
#94
,
|
|
|
Цитата korvin @ Такая вот прямо обыденная, что даже исключения недостойна? Если там какой-то ну совсем уж необязательный файл, то что мешает перед открытием сначала проверить его наличие?Ошибка открытия файла — вполне себе обыденная ситуация. Цитата korvin @ Интересно, что именно с ними не так однознчно? У них вроде только один недостаток - некоторый оверхед, который в некоторых случаях может быть нежелателен. Не помню где, читал так же мнение, что с исключениями как-то не всё однозначно в конкуррентном коде. |
Сообщ.
#95
,
|
|
|
Цитата korvin @ ПО потеряло контроль над железом, гильотина пустилась в свободное плавание, Там ващета говорилось о программах на планшетах ![]() |
![]() |
Сообщ.
#96
,
|
|
M Итак, тематического разговора не получилось. Причём, стараниями самого ТС. Передо мной выбор: банка за флуд и неподчинение модератору или снос темы во флейм. Вы знаете моё отношение к банкам, так что не удивлю, если скажу, что сам я склоняюсь ко второму варианту. Но там тема зарастёт флудом куда сильнее. Итак, каков ваш выбор? Жду до вечера. Добавлено Ну вот, опять. Я ж говорю, не в теме. Надёжность железа тут ни причём, речь идёт исключительно о гарантиях отказоустойчивости софта. Добавлено Цитата applegame @ Никудышняя. Забей, стопудоф они просто не осилили, и сделали хорошую мину.Аргументация разработчиков Go какая-то никудышная: Что считать исключительной ситуацией, а что нет – это сугубо личное дело архитектора системы. По определению ситуация исключительна, если не позволяет далее исполнять контракт. Деление на нуль. Возврат ссылки в никуда. Не предусмотренная архитектурой ПО ситуация (привет ассертам). Вот тупо невозможно и всё тут, следующая инструкция не может быть исполнена процессором, так что единственный выход – передача управления куда-то назад, где работать ещё было можно. Если ситуация предусмотрена архитектурой, она априори не исключительна, а предусмотрена бизнес-логикой. |
Сообщ.
#97
,
|
|
|
Цитата applegame @ Я вот задаюсь вопросом, почему некоторые так не любят исключения. Вообще не любят. Например, их выбросили из Rust и Go. Аргументация разработчиков Go какая-то никудышная: Самое забавное, что в Go вполне можно использовать их "панику" как исключения: ![]() ![]() func trowException() { fmt.Println("Throwing 'exception'") panic("'exception'") } func main() { defer func() { if r := recover(); r != nil { fmt.Println("Catching ", r) } }() trowException() } Так что "отказ", по моему, выглядит просто как "мы сделаем исключения неудобными и не будем поощрять их в АПИ". Опять же, постулируется, что "традиционные исключения" неудобные и неявно нарушают поток выполнения, но по моему гошное решение ничем не лучше. А по читаемости так ещё и хуже, более очевидных, try/catch блоков. Может, конечно, я чего-то не понимаю. В расте панику, кстати, тоже можно перехватывать, но только на границе потоков. В остальном всё тоже обычно - стек разматывается, деструкторы вызываются. "Возвращать" через панику можно произвольные типы. По идее, ничего не мешает и нормальным исключениям когда-то появиться. |
![]() |
Сообщ.
#98
,
|
|
Цитата applegame @ Такая вот прямо обыденная, что даже исключения недостойна? Если там какой-то ну совсем уж необязательный файл, то что мешает перед открытием сначала проверить его наличие? А так же режим доступа и, возможно, что-то ещё. Вот это и делается, в результате выдаётся дескриптор и значение типа error, которое в случае успешной операции является просто nil, иначе содержит информацию о причинах неудачи. Всяко лучше, чем тупой false. Добавлено Но не нужно. Точнее не рекомендуется эти паники отлавливать, т.к. они сигнализируют в первую очередь об ошибке в коде (типа отсутствия проверки индекса и как следствие выхода за пределы массива), которые нужно исправить, а не о внештатной ситуации извне. Добавлено Цитата applegame @ Интересно, что именно с ними не так однознчно? У них вроде только один недостаток - некоторый оверхед, который в некоторых случаях может быть нежелателен. Сходу найти не смог, но вот на тему: http://www.lighterra.com/papers/exceptionsharmful/ Навскидку: если корутина бросила исключение, кто и где должен его поймать? Т.е. исключение либо должно обязательно ловиться внутри корутины, либо что? |
Сообщ.
#99
,
|
|
|
Цитата korvin @ А так же режим доступа и, возможно, что-то ещё. Вот это и делается, в результате выдаётся дескриптор и значение типа error, которое в случае успешной операции является просто nil, иначе содержит информацию о причинах неудачи. Всяко лучше, чем тупой false. Вообще говоря является ли ошибка открытия файла исключительно ситуацией или нет, зависит от программы. Всё сводится к Цитата Qraizer @ По определению ситуация исключительна, если не позволяет далее исполнять контракт Если мы соблюдаем контракт без файла, то ничего исключительного нет. Потому и делать следует как-то так ![]() ![]() template<typename SyncReadStream, typename MutableBufferSequence> std::size_t read(SyncReadStream & s, const MutableBufferSequence & buffers); template<typename SyncReadStream, typename MutableBufferSequence> std::size_t read(SyncReadStream & s, const MutableBufferSequence & buffers, boost::system::error_code & ec); |
Сообщ.
#100
,
|
|
|
Цитата korvin @ Но не нужно. Точнее не рекомендуется эти паники отлавливать Ну дык, я об этом и написал. Но это ведь никак не тянет на "отказ от исключений" (на уровне языка). Вон в С++ в стандартной библиотеке практически нет исключений. В Qt вообще нет. Но пользоваться ими не мешают. Цитата korvin @ Т.е. исключение либо должно обязательно ловиться внутри корутины, либо что? Это и для банальных колбеков актуально. Но это просто ограничения отдельных случаев. Не понимаю зачем из-за них жертвовать удобным механизмом. |
![]() |
Сообщ.
#101
,
|
|
Цитата MyNameIsIgor @ Вообще говоря является ли ошибка открытия файла исключительно ситуацией или нет, зависит от программы. Зависит. Но какой смысл тогда собственно в исключениях? Если мы их перехватываем, то это равнозначно проверке кода ошибки. Да, исключения позволяют избавиться от вереницы if'ов, например, но в том же Хаскелле с этим не менее успешно справляются монады. Если же мы их не перехватываем, то чем они отличаются от abort() или там System.exit(EXIT_CODE)? Добавлено Цитата DarkEld3r @ Это и для банальных колбеков актуально. Но это просто ограничения отдельных случаев. Не понимаю зачем из-за них жертвовать удобным механизмом. Отдельные случаи? Конкуррентного кода становится всё больше и больше. Не понимаю, почему бы ради такого удобного механизма не пожертвовать какими-то исключениями? =) |
Сообщ.
#102
,
|
|
|
Цитата korvin @ Если мы их перехватываем, то это равнозначно проверке кода ошибки. Перехватывать мы их можем где угодно выше по стеку. Получаем такие профиты, как 1) отсутствие необходимости руками заботливо передавать ошибку и 2) полиморфные объекты ошибок позволяют передавать различную информацию об ошибке, не изменяя API. Цитата korvin @ Да, исключения позволяют избавиться от вереницы if'ов, например, но в том же Хаскелле с этим не менее успешно справляются монады. Ну, не знаю... А если мы получаем Maybe, а отдать в функцию дальнейшей обработки нам надо какой-то конкретный тип, то как без условия? |
![]() |
Сообщ.
#103
,
|
|
Цитата DarkEld3r @ Ну дык, я об этом и написал. Но это ведь никак не тянет на "отказ от исключений" (на уровне языка). Вон в С++ в стандартной библиотеке практически нет исключений. В Qt вообще нет. Но пользоваться ими не мешают. Почему не тянет? Исходники Go открыты, ты можешь переписать его, например, без использования GC, тянет ли это на отказ от возможности вручную управлять освобождением памяти (на уровне языка)? Тебе ж никто не мешает. |
Сообщ.
#104
,
|
|
|
Цитата korvin @ Не понимаю, почему бы ради такого удобного механизма не пожертвовать какими-то исключениями? =) Погоди. А почему ради конкурентного кода необходимо жертвовать исключениями? Из-за этого? Цитата korvin @ Навскидку: если корутина бросила исключение, кто и где должен его поймать? Т.е. исключение либо должно обязательно ловиться внутри корутины, либо что? Либо концепция future/promise. |
Сообщ.
#105
,
|
|
|
Цитата korvin @ но в том же Хаскелле с этим не менее успешно справляются монады Вроде, в хаскеле тоже можно пробрасывать ошибки через несколько уровней и ловить их потом (error/catch) без оборачивания результата промежуточных функций в монады? Цитата korvin @ не менее успешно справляются монады Ещё бы с монадами как-то справиться... ![]() Ну это можно не воспринимать всерьёз, но тем не менее, хаскель далеко не мейнстрим и осилить его явно сложнее, чем тот же Gо. Цитата korvin @ Конкуррентного кода становится всё больше и больше. Не понимаю, почему бы ради такого удобного механизма не пожертвовать какими-то исключениями? =) Во первых, ещё вопрос какого кода больше. Во вторых, исключения можно использовать изолированно получая более краткий код. В третьих, что самое смешное - ими не пожертвовали. |