Меня по-прежнему поражает, что в наши дни продукты, которые годами используются под ленточным движением, созданные командами профессионалов и по сей день, не могут предоставить полезные сообщения об ошибках пользователю. В некоторых случаях добавление всего лишь небольшого фрагмента дополнительной информации может сэкономить пользователю много времени.
Программа, которая генерирует ошибку, сгенерировала ее по причине. Он имеет все в своем распоряжении, чтобы сообщить пользователю как можно больше, почему что-то не получилось. И все же кажется, что предоставление информации для помощи пользователю является низким приоритетом. Я думаю, что это огромный провал.
Один пример из SQL Server. Когда вы пытаетесь восстановить базу данных, которая используется, она совершенно справедливо не позволит вам. SQL Server знает, какие процессы и приложения обращаются к нему. Почему он не может включать информацию о процессе (ах), которые используют базу данных? Я знаю, что не все передают Applicatio_Name
атрибут в строке подключения, но даже подсказка о рассматриваемой машине может быть полезной.
Другой кандидат, также SQL Server (и mySQL) - это прекрасное string or binary data would be truncated
сообщение об ошибке и его эквиваленты. Много времени, простое изучение оператора SQL, который был сгенерирован, и таблица показывает, какой столбец является виновником. Это не всегда так, и если механизм базы данных обнаружил ошибку, почему он не может сэкономить нам это время и просто сообщает нам, какой это был проклятый столбец? В этом примере вы можете утверждать, что при его проверке производительность может снизиться, и это может помешать автору записи. Хорошо, я куплю это. Как насчет того, чтобы ядро базы данных узнало, что произошла ошибка, после этого оно быстро сравнивает значения, которые должны были быть сохранены, с длиной столбцов. Затем отобразите это пользователю.
Виновные адаптеры таблиц ASP.NET также виноваты. Запросы могут быть выполнены, и может быть выдано сообщение об ошибке, говорящее, что ограничение где-то нарушается. Спасибо за это. Пришло время сравнить мою модель данных с базой данных, потому что разработчики слишком ленивы, чтобы предоставить хотя бы номер строки или пример данных. (Кстати, я бы никогда не использовал этот метод доступа к данным по выбору , это просто проект, который я унаследовал!).
Всякий раз, когда я выкидываю исключение из своего кода на C # или C ++, я предоставляю все, что у меня есть, под рукой. Было принято решение выбросить его, поэтому чем больше информации я могу дать, тем лучше. Почему моя функция выдает исключение? Что было передано и что ожидалось? Мне требуется немного больше времени, чтобы поместить что-то значимое в текст сообщения об исключении. Черт, это только помогает мне, пока я развиваюсь, потому что я знаю, что мой код выбрасывает вещи, которые имеют смысл.
Можно утверждать, что сложные сообщения об исключениях не должны отображаться пользователю. Хотя я не согласен с этим, это аргумент, который может быть легко умиротворен, если иметь различный уровень детализации в зависимости от вашей сборки. Даже в этом случае пользователи ASP.NET и SQL Server не являются вашими обычными пользователями и предпочитают что-то, наполненное многословностью и вкусной информацией, потому что они могут быстрее выследить свои проблемы.
Почему разработчики считают, что в наше время нормально предоставлять минимальный объем информации при возникновении ошибки?
Это 2011 ребята, приходите на .
источник
Ответы:
Хотя существует множество примеров плохих сообщений об ошибках, которых просто не должно быть, вы должны помнить, что не всегда можно предоставить информацию, которую вы хотели бы видеть.
Существует также обеспокоенность по поводу раскрытия слишком большого количества информации, что может привести к ошибкам разработчиков. (Я обещаю вам, что игра слов не была предназначена, но я не убираю это теперь, когда я заметил это.)
Иногда также существует тот факт, что сложное сообщение об ошибке бесполезно для конечного пользователя. Сайдинг с информационной перегрузкой не обязательно является хорошим подходом для сообщений об ошибках. (Это может быть лучше всего сохранено для регистрации.)
источник
For further information, see log20111701.txt
. Это было бы шагом в правильном направлении.Разработчики не те люди, которые пишут сообщения об ошибках.
Они видят приложение под неправильным углом. Они чрезвычайно осведомлены о том, что пошло не так внутри кода, но часто не подходят к программному обеспечению с точки зрения попыток чего-то достичь. В результате важная информация для разработчика не обязательно важна для пользователя.
источник
Благотворительный взгляд:
Разработчик работал в тесном контакте с кодом и изо всех сил пытался понять кого-то, чье понимание не было с ним. В результате они думают, что сообщения об ошибках в порядке, просто у них нет хорошей системы отсчета, по которой их можно судить.
Интеллектуальные сообщения об ошибках на самом деле трудно сделать. Не только писать их, но вы должны решить все, что может пойти не так, оценить вероятность и предоставить полезную информацию (которая почти наверняка варьируется в зависимости от контекста) обратно человеку, читающему сообщение, чтобы позволить им исправить его.
Для большинства приложений трудно найти хороший повод для такого рода вещей, как хотелось бы следующему разработчику, потому что ошибки встречаются не так часто. Кроме того, если бы у вас было это дополнительное время, разве вы не должны тратить его на то, чтобы останавливать ошибки, а не сообщать о них?
Нечестивый взгляд:
Реальность, вероятно, где-то посередине, хотя мой опыт на самом деле говорит мне, что она гораздо больше прежней, чем поздней - в основном это довольно сложно и требует значительных усилий, чтобы справиться с чем-то, что, вероятно, не произойдет.
источник
Process Handle Raped By Spawned Injector, Quitting SYstem.
.... user: "wtf я сделал?`). Но в случае с SQL Server / ASP.NET я думаю, что можно было бы приложить больше усилий :)string/binary data
ошибку, которая извлекает всю информацию столбца из указанной таблицы, анализирует прошлые значения и показывает, какие столбцы были бы нарушением. Это было тривиально. Может быть, я слишком сильно скучаю, потому что мои примеры кейсов тривиальны, но я полностью понимаю, что это не всегда так. Как мы не дадим порожденным инжекторам изнасиловать процессы, может быть довольно сложно :)К сожалению, более полезные сообщения об ошибках стоят времени разработчика, что равнозначно деньгам компании. Продукты достаточно дороги, чтобы построить как есть. Да, было бы здорово иметь больше полезных сообщений об ошибках, и я согласен, что должно быть больше полезных сообщений. Тем не менее, это просто факт жизни, что, когда вы находитесь в крайнем сроке, и деньги на линии, вы должны что-то сократить. «Более симпатичные сообщения об ошибках», как могут видеть менеджеры, скорее всего, будут первыми.
источник
Я согласен, что сообщения об ошибках должны быть как можно более конкретными.
Одной из причин общих сообщений об ошибках, вероятно, является использование кодов ошибок. При использовании исключений вы можете передать все необходимое в сообщении об ошибке. При использовании кодов возврата нет места для кодирования имени столбца. Возможно, ошибка обрабатывается универсальной функцией, которая не знает контекста и просто переводит код ошибки в строку.
источник
источник
Как общее замечание, вы должны учитывать, что любая ошибка или исключительная ситуация - именно это: исключительная. Это сокращает запланированную и разработанную процедуру. Это несовместимо с тем, как вещи, где планируется работать. Если бы это было не так, то не было бы никакой необходимости выручить с ошибкой прерывания.
Мы, программисты, обучены заботиться о самозащите этой запланированной процедуры. Таким образом, мы регулярно включаем некоторые проверки работоспособности, чтобы проверить наши предположения. Когда эти проверки здравомыслия проваливаются, мы просто знаем, что план как-то провалился ...
Ваше требование - оно вполне может выглядеть как здравый смысл с точки зрения пользователя - невозможно выполнить, если учесть реальность работы такой системы. Вы просите упорядоченную выписку с хорошо организованной и подходящей информацией. Более того, вы даже просите, чтобы эта презентация проходила таким образом, который вписывается в общий дизайн приложения / обработки. Очевидно, эта информация существует где-то в системе. Очевидно, что он даже существует там упорядоченным и хорошо организованным образом (будем надеяться). НО в тот момент, когда происходит ошибка, никто никогда не планировал делать эту информацию доступной. Ошибка всегда является частичной потерей контроля.Эта потеря контроля может произойти на разных уровнях. Это может быть система, работающая во время выполнения не так, как планировалось. Но также может быть так, что фактическая реализация оказалась гораздо более сложной и отличной по деталям, чем планировалось, и не было заложенного в резерв положения, чтобы справиться с этой ситуацией удовлетворительно. Это тоже частичная потеря контроля.
Чтобы связать это с конкретным примером, который вы привели: если в точке ошибки будут известны имя и тип столбца таблицы, а также длина необходимого пространства, то не будет никаких причин для поднять ошибку, не так ли? Мы могли бы просто исправить ситуацию и действовать в соответствии с планом. Сам факт того, что мы вынуждены выдвинуть ошибку, показывает нам, что все сбилось с пути. Тот факт, что этой информации нет под рукой, является исключением .
То, что я пишу здесь, может показаться очевидным и простым здравым смыслом. Но на самом деле это очень трудно понять. Мы постоянно пытаемся понять это, применяя моральные категории - как будто должен быть виновник, должен быть плохой ленивый человек, который не заботится о бедном пользователе, должны быть жадные бизнесмены, которые сделали способ дешевого вычисления. Все это совершенно не имеет значения
Возможность потери контроля проистекает из того факта, что мы все делаем планомерно и упорядоченно .
источник
Я работаю инженером службы поддержки в программной фирме, и часто мы видим сообщения об ошибках, которые являются новыми для нас. Часто, когда я отсылаю их обратно в нашу команду разработчиков, им приходится искать сообщение в источнике приложения.
Мне кажется, что даже если бы он не был представлен пользователям, для нас было бы безопасно сэкономить много времени, если бы команда разработчиков добавляла примечание к индексу документации или базе данных с сообщениями об ошибках всякий раз, когда добавляла новое, это делало бы это Нам гораздо быстрее найти причину проблем клиентов и сэкономить их время ...
источник
Проблема, которую вы видите, на самом деле является одним из побочных эффектов правильной инкапсуляции и сокрытия информации.
Современные системы чрезвычайно сложны. Существует небольшой шанс, что рядовой разработчик сможет держать в голове ментальную модель всей системы от пользовательского интерфейса до необработанного двоичного файла, пока он кодирует какую-то конкретную задачу.
Таким образом, пока разработчик сидит и кодирует, скажем, бит, который восстанавливает файл базы данных, его ментальная модель полностью заполнена битами, окружающими процесс восстановления файла базы данных. Ему нужно (и я полагаю, я не написал этот код) прочитать файл, проверить свойства, прочитать версии, сделать резервную копию существующих данных, выбрать стратегию слияния / перезаписи и т. Д. Вполне вероятно, если есть даже пропуск рассмотрение UI, его в строке ошибки, которую он пишет в обработчике исключений. Что-то типа:
В этом примере полезная информация, которую вы запрашиваете с точки зрения процессов, которые могут использовать файл, или даже других потоков в БД, полностью выходит за рамки (программно). Там могут быть сотни классов, которые имеют дело с файлами БД; импорт в эти классы информации о любом другом процессе, использующем файлы, или о функциональных возможностях для доступа к файловой системе и просмотра других запущенных процессов (при условии, что эти процессы даже находятся на ЭТОМ компьютере) приведет к так называемой утечке абстракции ; в производительности есть прямые затраты.
Вот как такие ошибки могут сохраняться в наши дни. Очевидно, они все МОГУТ быть исправлены; но во многих случаях это связано с гораздо большими накладными расходами, чем можно подумать (в этом случае, например, вам может потребоваться, чтобы эта функция пересекала перечисление сетевых подключений и общих ресурсов, чтобы увидеть, использует ли удаленный компьютер этот файл базы данных для некоторых причина) и стоимость далеко не тривиальна.
источник
GenericException
, я мог бы 1) Спросить уProcesses
подсистемы список процессов. 2) Спросите у каждого процесса, какую базу данных они используют. 3) Сопоставьте процесс с базой данных, назначенной той, которую я пытаюсь перезаписать, 4) сгенерируйтеDatabaseInUse(dbName, processName, applicationName
исключение. :)Моим фаворитом был (еще в конце 70-х) компилятор Univac Fortran IV, когда он читал не цифры, честно объявил
источник
Я полагаю, что большинство сообщений об ошибках на самом деле являются ориентированными на программиста (себя) прославленными утверждениями кода отладки / printf.
Написание ориентированных на пользователя сообщений об ошибках означает знание того, кто ваш пользователь, и предвидение того, что он захочет узнать. Находясь в процессе написания кода, разработчик более склонен написать сообщение об ошибке, полезное для себя, либо для отладки кода, который они пишут в данный момент, либо для известного или преобладающего варианта использования.
Переключение с написания кода на разработку текстовой части пользовательского интерфейса (или взаимодействия с пользователем) - это переключение контекста. В больших приложениях, таких как многоязычные приложения, это может означать, что они передаются другому человеку или команде (пользовательский интерфейс, перевод), а не полностью обрабатываются разработчиком, поэтому, если разработчик тщательно не объясняет контекст сообщения, важные детали могут быть легко теряется
Конечно, проверка и проверка обработки ошибок часто считается низким приоритетом, поскольку ошибки и исключения обрабатываются (т. Е. Перехватываются), этому не уделяется особого внимания. Это умственно неблагополучное место кодовой базы для разработчиков или QA для оценки, поскольку условия ошибок часто имеют негативную коннотацию (то есть ошибку или неудачу), связанную с ними.
источник
Я думаю, что причина в том, что сообщения об ошибках / обработка всегда выполняются как последующие мысли . Даже когда они не совсем после размышлений, они в основном граждане второго сорта в общем дизайне.
Современное программное обеспечение обычно состоит из нескольких слоев. Когда ваша логика сообщения об ошибках спешно и не задумывается, часто бывает трудно собрать всю информацию, необходимую для представления полезных сообщений об ошибках.
Например, ошибка обнаруживается в серверной части, но для составления исчерпывающего сообщения об ошибке требуется некоторая информация из более высоких уровней. Большинству хороших сообщений об ошибках нужна информация почти со всех уровней (чтобы дать нам полное представление о том, что произошло в системе). Идеальное сообщение об ошибке выглядело бы так: «Хорошо, мы сначала получили строку, затем она прошла через анализатор, который дал что-то смешное, вы могли бы захотеть посмотреть там. В любом случае, вещь была передана дальше ...»
Выполнение этого часто потребовало бы ненужной связи, если механизм сообщения об ошибках не был гражданином первого класса на этапе проектирования. Я полагаю, что большинство людей просто находят слишком много работы для чего-то, что не выглядит впечатляюще (кому нравится говорить: «Видите? Моя программа упала, и сообщение об ошибке полезно!»).
источник