LINUX.ORG.RU
ФорумTalks

[ненависть][программизды] игнорирование ошибок

 


0

2

у меня одного такое ощущение, что программизды в своих изобретениях стали стесняться показывать сообщения об ошибках? это HIG? или мода такая?

Evolution - вообще пожизненный молчок. может я неправильно им пользовался, но если пропадает инет, или IMAP посылает на 3 буквы - он тупо молчит. Нету почты и все тут.

на андроиде каждая вторая софтина с таким приколом - нету сети - ничего не работает, и _молча_.

Примеров еще много, сейчас не вспомню все, но собственно последняя капля, спровоцировавшая данный пост - HomeBank - закончилось место на диске (да, бывает такое несчастье), нажимаю на «Сохранить» - оно _молчит_, и выдает файл на 0 байт. Я потерял историю домашнего бюджета за 2 недели (да, бекапы, но как-то получилось что последний бекап - 2-х недельной давности, и бекапы не должны решать кривизну софта).

Выдох.

★★★★★
Ответ на: комментарий от AndreyKl

> если сети немая, никто ничего не гарантирует на самом деле.

Ну вот и ответ на вопрос ТС'а, о чём тут ещё трепаться-то

name_no ★★
()
Ответ на: комментарий от name_no

не.. это не ответ. TCP даёт знать, доставил он пакет или нет. сокет в этом случае как я помню возрвращает ошибку. вот эту то ошибку нужно обработать и показать что сети у приложения нету (ну там зелёненький шарик на серенький сменить, что ли...).

AndreyKl ★★★★★
()
Ответ на: комментарий от gentoo_root

ну вот не надо ля-ля.
винду многие считают глючной не потому, что они разбираются в ее гниловатых внутренностях, а потому что читать не умеют, и думают что если система сообщает об ошибке - значит она глюкавая. после чего бегут к умеющему читать, он читает и ему понятно что надо сделать.

а что, молчание в тряпочку - это Ъ по вашему?

dib2 ★★★★★
() автор топика
Ответ на: комментарий от geekless

> Ошибка «нет места» должна детектироваться во время write(), а не close().

write не обязательно детектирует ошибку

close нужно проверять, но это хрен кто делает (я например всегда пишу «временные» скрипты в которых никогда не обрабатываю клоз. правда ни разу от этого не страдал пока, но это специфика веб-разработки. к десктопам таки нужно другое отношение, имхо).

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Да что вы привязались к TCP? Какая разница, что там произошло на L4. Вам же нужно знать, не доставили ли пакет, а обработали, или нет.

vasily_pupkin ★★★★★
()
Ответ на: комментарий от name_no

> программа засунула свои байты в сокет и пока ACK не придёт — она из send не выйдет

по таймауту выйдет, емнип.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Это вообще не проблема TCP. Подтверждать доставку должна принимающая сторона посылкой соответствующего уведомления по протоколу IM-а. Пока подтверждение не получено, сообщения считается не доставленным.

name_no перекладывает с больной головы на здоровую, по сути, обвиняя ядро в отсутствии драйверов для астрала.

geekless ★★
()
Ответ на: комментарий от name_no

> И, самое интересное — что делать проге, когда она наконец получи от send'а ошибку? Писать, что интернет отвалился?

да, писать. что то типа «сообщение не доставлено» прямо в окне чата и сообщение делать сереньким. я так думаю.

Так вот же он, пока она ждала завершения своего send'а — базовая станция снова появилась.

ну если появилась, флаг в руки, пусть пишет дальше. можно поумнее сделать алгоритм. но такого бы вполне хватило, ящетаю.

AndreyKl ★★★★★
()
Ответ на: комментарий от dib2

>а что, молчание в тряпочку - это Ъ по вашему?

Нет, конечно, сам ненавижу это. Но ещё больше ненавижу сообщения об ошибках в венде, которые бывают 2-х видов:

— «Инструкция по адресу «4048D1FF» обратилась к памяти по адресу «00000000». Память не может быть «read»». — очень говорящее сообщение об ошибке, особенно если непонятно, какой функции принадлежит адрес, да и исходников нет.

— «STOP 0x0000000A». — no comments.

Только в Линуксе я увидел наконец-то нормальные сообщения об ошибках, но, оказывается, и здесь есть исключения.

gentoo_root ★★★★★
()
Ответ на: комментарий от Zhbert

А оказывается, что сеть уде минут 10 как отвалилась и ты пишешь в пустоту...

ты знаешь способ определить что сеть отвалилась?!

stevejobs ★★★★☆
()

Вообще, тред — наглядное подтверждение тому, какая херня случается, если игнорировать принципы философии юникса, которые отнюдь не от балды придуманы.

В данном конкретном случае игнорируется этот принцип: «Rule of Repair: When you must fail, fail noisily and as soon as possible.»

geekless ★★
()
Ответ на: комментарий от true_admin

ну наверное это селектом делается.. узнаётся ошибка.. я не помню досканально ибо лет 5 уже не брал в руки сокеты и прочие радости сишников, php-шник я нынче.

AndreyKl ★★★★★
()
Ответ на: комментарий от gentoo_root

ну ваши примеры - без комментариев, меня они, слава Богу, уже несколько лет как не касаются.
кстати, насчет «память не может быть...» - в линуксе обычно такое происходит тихим вылетом, с записью Segmentation fault в консоль (меня это устраивает, а на хомяков в линуксе мне плевать). Мне не сложно посмотреть выхлоп, но бывают моменты, когда это абсурдно.

dib2 ★★★★★
() автор топика
Ответ на: комментарий от vasily_pupkin

И в чем заключается принципиальная проблема?

для надёжной доставки нужно городить явные подтверждения на уровне приложения.

true_admin ★★★★★
()
Ответ на: комментарий от geekless

и даже более того, close может не детектировать ошибку. нужно делать фсинк перед клоз, чтобы гарантированно детектировать ошибку если закончилось место. это из-за кеша происходит.

вот из мана

A successful close does not guarantee that the data has been successfully saved to disk, as the kernel defers writes. It is not common for a file system to flush the buffers when the stream is closed. If you need to be sure that the data is physically stored use fsync(2). (It will depend on the disk hardware at this point.)

AndreyKl ★★★★★
()
Ответ на: комментарий от stevejobs

>ты знаешь способ определить что сеть отвалилась?!

Например, проверять соединение с сервером перед отправкой. Даже сраный QIP умеет и орет, если коннекта с сетью нет.

Zhbert ★★★★★
()
Ответ на: комментарий от AndreyKl

ну наверное это селектом делается

Ты так и не прочитал топик.

лет 5 уже не брал в руки сокеты

гнилая отмазка.

true_admin ★★★★★
()
Ответ на: комментарий от stevejobs

ты знаешь способ определить что сеть отвалилась?!

Знаю. Если сервер не отвечает на запросы то или сети нет или сервер подох.

true_admin ★★★★★
()
Ответ на: комментарий от geekless

наверное мы с ТСом живем в разных реальностях, но у меня большинство программ (если не вообще все) подтверждают получение

stevejobs ★★★★☆
()
Ответ на: комментарий от true_admin

Э... Лолшто? Это проблема? Это же фича. OSI, все дела )))

Хинт: что будет, если тред-обработчик сервер приложения на другой стороне внезапно закрешилось после приёма последнего буфера?

vasily_pupkin ★★★★★
()
Ответ на: комментарий от AndreyKl

> и даже более того, close может не детектировать ошибку. нужно делать фсинк перед клоз, чтобы гарантированно детектировать ошибку если закончилось место. это из-за кеша происходит.

Одно дело, когда нам отрубили питание, и мы не дописали данные из кэша, и другое — когда write() «успешно» отрабатывает, не резервируя места под запись данных. Отсутствие места — вполне себе штатная ситуация, с которой адекватно должно работать как ядро, так и приложение.

geekless ★★
()
Ответ на: комментарий от Zhbert

> Например, проверять соединение с сервером перед отправкой.

если у тебя Очень Медленная Сеть, то это увеличивает задержку при отправке в несколько раз. Например, когда-то в JIMM на мобилке сообщение могло идти в аську пару минут. В твоем варианте оно шло бы минут пять, если б не стерлось вообще по таймауту.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Ну мб. Хотя все равно напрягает писать в пустоту.

Zhbert ★★★★★
()
Ответ на: комментарий от dib2

Слишком суровый и неточный способ проверять есть ли «сеть» :З С тем же успехом можно пользоваться обычным SO_KEEPALIVE

vasily_pupkin ★★★★★
()
Ответ на: комментарий от true_admin

> Если сервер не отвечает на запросы то или сети нет или сервер подох.

а если сервер отвечает на запросы с задержкой в 5 минут из-за перегрузки?

кстати, есть идея в веб-чатах начиная с какого-то уровня перегрузки писать «времени до обработки сообщения осталось ориентировочно 5 минуты».

Но ведь взвоют люди. Когда не видно, сколько минут осталось, просто думаешь «ну когда-ниубдь то и дойдет». А когда написаны цыферки, ты точно знаешь не только что говно, но и сколько граммов.

stevejobs ★★★★☆
()
Ответ на: комментарий от Zhbert

А болгенос стоит?

убунту? стоит на виртуалочке, но не используется. Она оказалась слишком сложной для меня.

stevejobs ★★★★☆
()
Ответ на: комментарий от vasily_pupkin

Это же фича. OSI, все дела )))

OSI никогда не был жив, это даже цисковские инженеры говорят. В реальной жизне всё всегда сложнее.

Хинт: что будет, если тред-обработчик сервер приложения на другой стороне внезапно закрешилось после приёма последнего буфера?

Это баг приложения. Но я согласен, всех проблем так не решить.

Тут мы плавно подходим к тому что tcp говно по определению и настоящий универсальный IPC должен быть пакетный и поддерживать передачу мета-информации(типа пакет принят/пакет обработан/этц). Потому что в том или ином виде это приходится городить в большинстве приложений.

true_admin ★★★★★
()
Ответ на: комментарий от stevejobs

а если сервер отвечает на запросы с задержкой в 5 минут из-за перегрузки?

«а разве это жизнь?». С таким QoS я бы не стал пользоваться сервисом.

true_admin ★★★★★
()
Ответ на: комментарий от dib2

>ну ваши примеры - без комментариев, меня они, слава Богу, уже несколько лет как не касаются.

Меня тоже. В основном из-за редкого пользования вендой (только в виртуалбоксе и по необходимости).

кстати, насчет «память не может быть...» - в линуксе обычно такое происходит тихим вылетом, с записью Segmentation fault в консоль

Зато можно через gdb поотлаживать.

А то, что несколько Линуксовых программ молчат при ошибках — проблема только этих немногих программ. В основном же при проблемах доступны подробные логи и нормальные сообщения об ошибках в консольных программах.

NetworkManager, кстати, тоже невнятные ошибки выдаёт. Например, при неудачном подключении к вай-фаю предлагает ввести пароль. Но зато в syslog пишет более подробно (хотя моей проблемы это и не решило).

gentoo_root ★★★★★
()
Ответ на: комментарий от true_admin

Технически нет особых проблем узнать, был ли доставлен пакет, кроме лютого батхерта от костылей. Можно каждый раз выставлять размер буффера под пакет, и смотреть, когда write на следующую пачку будет возвращать -1. Или на основании заполненности буфера делать вывод, какая часть данных была доставлена (ибо буфер очищается по интервалу ацка, а не с бухты барахты). Но это всё не правильно. Потому это не проблема TCP и L4. Приложению надо знать, был ли доставлен пакет приложения - пусть оно и проверяет, по своему протоколу.

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

vasily_pupkin ★★★★★
()
Ответ на: комментарий от geekless

не понял что ты сказал, но на всякий случай: по факту write может не вернуть ошибку если закончилось место. и клоз может не вернуть. чтобы гарантированно детектировать что место закончилось, в приложении нужно вызвать fsync. повторюсь, по факту.

AndreyKl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.