vitus_wagner (
vitus_wagner) wrote2017-03-15 09:37 am
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
Semantic locality
http://esr.ibiblio.org/?p=7421
Раймонд умный пост написал по поводу концепций, которые лежат под Unix way. Я эту мысль про семантическую локальность три дня думать буду.
Раймонд умный пост написал по поводу концепций, которые лежат под Unix way. Я эту мысль про семантическую локальность три дня думать буду.
no subject
Из логики "индекса в массиве не нашлось, значит, пользователь неправильное значение ввел. Ловим исключение и по нему ругаемся."
А тут внезапно индекс не нашелся где-то глубже по вызовам и поэтому все сломалось.
no subject
1. Проверяем индекс ("индекса в массиве не нашлось, значит, пользователь неправильное значение ввел"), и если он плохой - внятно ругаемся
2. "Ловим исключение и по нему ругаемся" -- опять же внятно.
3. Прокидываем исключение выше, там пишут 500 Internal Server Error
4. Показываем пользователю кишки системы, а также кровь, распидарасило и стектрейс
no subject
try
... = foo[bar()]
catch IndexOutOfBound
ShowMessage("У вас нет такого номера счета")
Мы вот решили поймать исключение при индексировании foo и внятно выругаться.
Семантика у foo такая, что если в нем чего-то нет, то пользователь не тот счет ввел
Вот только оказалось, что исключение прилетело не от нашего индексирования, а из глубин bar.
И все - при какой-то совершенно посторонней ошибке пользователю показывается "У вас нет такого счета".
А потом еще интефейс усовершенствовали, чтобы вводить ничего не надо, а надо выбрать из списка, но проверку оставили.
no subject
no subject
Это демонстрация того, как я понял утверждения хозяина журнала о потере контекста - что одно и то же исключение, которое бросилось тут и или там, нужно как-то различать , но это немного затруднительно.
no subject
Исключение OutOfBounds не имеет никакого бизнес-смысла само по себе, откуда бы оно ни вылетело. Оно может обрести такой смысл только после анализа инцидента разработчиками.
Однако, во многих случаях и глубокоуровневый код имеет возможность выкинуть исключение с бизнес-смыслом. Хотя бы ValidationFailedOutOfBoundsException extends ArrayIndexOutOfBoundsException - кому надо, может его поймать особым образом с учётом его бизнес-смысла, а кто не может - тот обработает его как техническое ArrayIndexOutOfBoundsException. Контекстом в данном случае будет точный подкласс и дополнительные его поля.
no subject
no subject
no subject
У любой системы, взаимодействующей с реальным миром, бывают случаи когда операцию выполнить нельзя из-за проблем, которые не во власти системы. Но очень часто - во власти пользователя. И основная моя претензия в том, что пользователю не выдается внятной информации о том, что делать в тех случаях, когда он что-то делать может. Ну или внятной информации о том, что делать бесполезно.
Возвращаясь к тому же банкомату - если в нем осталось 3 тысячных купюры, а пользователь запросил 4.5 тысяч, то при получении сообщения "Непрпавильная сумма" он скорее всего пойдет и выберет из менюшки 5 тысяч. Которых ему все равно не дадут, потому что их просто нет. А получи он сообщение "у меня осталось только три тысячи", он их и снимет.
Кстати, банкомат который вменяемо указывает сколько денег можно снять, я видел. Причем он хитрый, указывает сумму по-моему не более 2/3 оставшихся денег, чтобы следующему хоть что-то осталось.
no subject