Какая ошибка в программе

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

В Microsoft Visual C++ значения success, warning и failure возвращаются с помощью 32-разрядного числа, известного как HRESULT. Список системных значений HRESULT см. в файле заголовка Winerror.h, который входит в состав windows SDK. Этот файл содержит все коды и описания ошибок COM+. Дополнительные сведения о значениях HRESULT см. в разделе Обработка ошибок.

На языке Java создается экземпляр com.ms.com.ComFailException, указывающий на сбой, где объект ComFailException указывает HRESULT. Экземпляр com.ms.com.com.ComSuccessException указывает на успешное выполнение с возвращаемым значением False. Сведения о интерпретации этих исключений см. в документации по Microsoft Visual J++.

Процессы сервера приложений COM+, в которых размещаются объекты Visual J++, не будут бездействующими (даже с нулевыми активными объектами), если вы не отключите JIT-отладку в интегрированной среде разработки VJ6. Сведения о том, как это сделать, см. в документации по Visual J++.

Я — телохранитель. Ошибка в программе. Сериал. Серия 1 из 4. Феникс Кино. Детектив

В Visual Basic можно получить значения HRESULT , проверив свойство Err.Number. Описание ошибки можно получить с помощью свойства Err.Description.

Вы также можете использовать служебную программу ERRLOOK в Microsoft Visual Studio для получения системного сообщения об ошибке или сообщения об ошибке модуля. ERRLOOK автоматически извлекает текст сообщения об ошибке при перетаскивании шестнадцатеричного или десятичного значения из отладчика Visual Studio или другого приложения с поддержкой автоматизации. Вы также можете ввести значение, введя или вставив его из буфера обмена интегрированной среды разработки и щелкнув параметр Поиск .

Следующий метод C++ выводит описание ошибки на основе входных данных HRESULT.

#include #include #include void ErrorDescription(HRESULT hr) < if(FACILITY_WINDOWS == HRESULT_FACILITY(hr)) hr = HRESULT_CODE(hr); TCHAR* szErrMsg; if(FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) _tprintf(TEXT(«%s»), szErrMsg); LocalFree(szErrMsg); >else _tprintf( TEXT(«[Could not find a description for error # %#x.]n»), hr); >

В следующей таблице приведены описания распространенных кодов ошибок в COM+.

Коды ошибок Определения
COMADMIN_E_ALREADYINSTALLED Объект уже зарегистрирован.
COMADMIN_E_APP_FILE_READFAIL Произошла ошибка при чтении файла приложения.
COMADMIN_E_APP_FILE_VERSION Недопустимый номер версии в файле приложения.
COMADMIN_E_APP_FILE_WRITEFAIL Произошла ошибка при записи в файл приложения.
COMADMIN_E_APPDIRNOTFOUND Каталог установки приложения не найден.
COMQC_E_APPLICATION_NOT_QUEUED С помощью моникера «очередь» можно создавать только приложения COM+, помеченные как queued.
COMADMIN_E_APPLICATIONEXISTS Приложение уже установлено.
COMADMIN_E_APPLID_MATCHES_CLSID На этом компьютере уже установлен идентификатор CLSID с тем же идентификатором GUID, что и новый идентификатор приложения.
COMADMIN_E_APP_NOT_RUNNING Указанное приложение в настоящее время не выполняется.
COMADMIN_E_AUTHENTICATIONLEVEL Не удается задать необходимый уровень проверки подлинности для запроса на обновление.
COMADMIN_E_BADPATH Недопустимый путь к файлу.
COMADMIN_E_BADREGISTRYLIBID Недопустимый идентификатор зарегистрированной библиотеки типов.
COMADMIN_E_BADREGISTRYPROGID Идентификатор ProgID компонента отсутствует или поврежден.
COMADMIN_E_CAN_NOT_EXPORT_APP_PROXY Прокси приложения не экспортируется.
COMADMIN_E_CAN_NOT_START_APP Не удалось запустить приложение, так как это либо приложение библиотеки, либо прокси приложения.
COMADMIN_E_CAN_NOT_EXPORT_SYS_APP Системное приложение невозможно экспортировать.
COMADMIN_E_CANT_SUBSCRIBE_TO_COMPONENT Пользователь не может подписаться на этот компонент, так как компонент мог быть импортирован.
COMADMIN_E_CANTCOPYFILE При копировании файла произошла ошибка.
COMADMIN_E_CLSIDORIIDMISMATCH Идентификаторы CLSID или IID файла приложения не соответствуют соответствующим библиотекам DLL.
COMADMIN_E_COMP_MOVE_BAD_DEST Сбой перемещения компонента, так как целевое приложение больше не существует.
COMADMIN_E_COMP_MOVE_LOCKED Перемещение компонента было запрещено, так как исходное или конечное приложение является системным приложением или заблокировано для изменений.
COMADMIN_E_COMPFILE_BADTLB Не удалось загрузить библиотеку типов.
COMADMIN_E_COMPFILE_CLASSNOTAVAIL Библиотека DLL не поддерживает компоненты, перечисленные в библиотеке типов.
COMADMIN_E_COMPFILE_DOESNOTEXIST Этот файл не существует.
COMADMIN_E_COMPFILE_GETCLASSOBJ Произошел сбой метода GetClassObject в библиотеке DLL.
COMADMIN_E_COMPFILE_LOADDLLFAIL Не удалось загрузить библиотеку DLL.
COMADMIN_E_COMPFILE_NOREGISTRAR Регистратор компонентов, указанный в этом файле, недоступен.
COMADMIN_E_COMPFILE_NOTINSTALLABLE Файл не содержит сведения о компонентах или компонентах.
COMADMIN_E_COREQCOMPINSTALLED Компонент в той же библиотеке DLL уже установлен.
COMADMIN_E_DLLLOADFAILED Не удалось загрузить библиотеку DLL.
COMADMIN_E_DLLREGISTERSERVER При установке компонента произошел сбой функции DllRegisterServer .
COMADMIN_E_EVENTCLASS_CANT_BE_SUBSCRIBER Класс событий нельзя настроить в качестве компонента подписчика. При попытке создать подписку с классом событий в качестве подписчика возвращается эта ошибка.
COMADMIN_E_INVALIDUSERIDS Один или несколько пользователей в файле приложения являются недопустимыми.
COMADMIN_E_KEYMISSING Объект не найден в каталоге.
COMADMIN_E_LIB_APP_PROXY_INCOMPATIBLE Приложения библиотеки и прокси-серверы приложений несовместимы. Эта ошибка возвращается при попытке экспортировать прокси приложения, а свойство активации приложения является библиотекой.
COMADMIN_E_NOREGISTRYCLSID Идентификатор CLSID компонента отсутствует или поврежден.
COMADMIN_E_NOSERVERSHARE Общая папка сервера недоступна.
COMADMIN_E_NOTCHANGEABLE Изменения в этом объекте и его вложенных объектах отключены.
COMADMIN_E_NOTDELETEABLE Функция удаления отключена для этого объекта.
COMADMIN_E_NOTINREGISTRY Объект не найден в реестре.
COMADMIN_E_NOUSER Один или несколько пользователей недопустимы.
COMADMIN_E_OBJECT_DOES_NOT_EXIST Не удается найти один из указанных объектов.
COMADMIN_E_OBJECT_PARENT_MISSING Один из вставляемых или обновляемых объектов не принадлежит допустимой родительской коллекции.
COMADMIN_E_OBJECTERRORS Произошли ошибки при доступе к одному или нескольким объектам. Дополнительные сведения см. в разделе Коллекция ErrorInfo .
COMADMIN_E_OBJECTEXISTS Объект, который вы пытаетесь добавить или переименовать, уже существует.
COMADMIN_E_OBJECTINVALID Одно или несколько свойств объекта отсутствуют или недопустимы.
COMADMIN_E_OBJECTNOTPOOLABLE Этот объект не может быть включен в пул.
COMADMIN_E_PROPERTYSAVEFAILED Одно или несколько параметров свойств являются недопустимыми или конфликтуют друг с другом.
COMADMIN_E_PROPERTY_OVERFLOW Слишком большое значение свойства.
COMADMIN_E_REGFILE_CORRUPT Файл регистрации поврежден.
COMADMIN_E_REGISTERTLB Системе не удалось зарегистрировать библиотеку типов.
COMADMIN_E_REGISTRARFAILED Произошли ошибки в регистраторе компонентов.
COMADMIN_E_REMOTEINTERFACE Сведения об интерфейсе либо отсутствуют, либо изменяются.
COMADMIN_E_REQUIRES_DIFFERENT_PLATFORM Эта операция не включена на этой платформе.
COMADMIN_E_ROLE_DOES_NOT_EXIST Роль, назначенная компоненту, интерфейсу или методу, не существует в приложении.
COMADMIN_E_ROLEEXISTS Роль уже существует.
COMADMIN_E_SERVICENOTINSTALLED Служба не установлена.
COMADMIN_E_SESSION Версия каталога сервера не поддерживается.
COMADMIN_S_SOMEALREADYPAUSED Один или несколько указанных процессов приложения уже приостановлены.
COMADMIN_S_SOMEALREADYRUNNING Один или несколько указанных процессов приложения уже запущены.
COMADMIN_E_START_APP_NEEDS_COMPONENTS Чтобы запустить приложение, в приложении должны быть компоненты.
COMADMIN_E_SVCAPP_NOT_POOLABLE_OR_RECYCLABLE Приложения COM+, работающие как служба NT, не могут быть помечены как объединенные в пул или перезапуск.
COMADMIN_E_SYSTEMAPP Эта операция не может быть выполнена в системном приложении.
COMADMIN_E_USER_IN_SET Одному или нескольким пользователям уже назначен локальный набор секций.
COMADMIN_E_USERPASSWDNOTVALID Недопустимый идентификатор или пароль, заданные в приложении.
Читайте также:
Программа где можно рисовать в видео

Я телохранитель. Ошибка в программе. Все серии. Феникс Кино. Детектив

Источник: learn.microsoft.com

Обработка ошибок в Golang

Слышатся сирены. Студенты и учителя быстро выскочили из классов и столпились у точки сбора. Никакой опасности в поле зрения нет и ничего не горит. Это очередная учебная пожарная тревога. В случае реальной чрезвычайной ситуации все точно будут знать, что делать.

Премиум канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании!

Уроки, статьи и Видео

Home

Перевод: портал software-testing.ru

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

Начальные знания о сообщениях об ошибке

Программа выводит сообщение об ошибке в ответ на необычную или исключительную ситуацию, которую не может разрешить самостоятельно. Если программа написана корректно, сообщения об ошибке у нее выводятся нечасто: везде, где это возможно, программа сама справляется с возникающими проблемами и не обращается за помощью к пользователю.

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

Конечно, самое лучшее сообщение об ошибке – это его отсутствие. Если что-то пошло не так, программа должна использовать все доступные средства, чтобы как можно быстрее исправить ошибку. Например, она не должна выводить сообщение о том, что файл не найден, если поиск не был произведен достаточно тщательно.

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

Если вывести сообщение об ошибке все же необходимо, не тратьте время пользователя впустую, если можно заранее предсказать возникновение проблем. Например, программа установки не должна начинать копирование файлов, пока не произведена проверка на наличие свободного места на диске. Путём несложных вычислений можно определить, достаточно ли свободного места на диске, но большинство программ не делает такую проверку. Если программа установки прерывает процесс, когда ей требуется перезаписать какой-нибудь файл – это тоже плохо, так как вынуждает пользователя постоянно следить за процессом установки.

При этом не стоит полагаться и на операционную систему. Удивительно, но команды DOS COPY и XCOPY до сих пор не проводят проверку на наличие свободного места на диске перед началом копирования файлов; вместо этого копирование начинается “вслепую” с надеждой на то, что места будет достаточно. Windows ничуть не лучше, эта система тоже не проверяет диск на наличие свободного места перед копированием файлов. Хуже того, если вы одновременно копируете несколько файлов, Windows прерывает процесс копирования после обнаружения первой ошибки и “забывает”, какие файлы были выделены для копирования.

При написании программы старайтесь предугадать условия возникновения ошибки и реакцию системы на эти ошибки. Постарайтесь выполнить задачу пользователя максимально точно, и не относитесь к ошибке как катастрофе (если, конечно, это не является реальной катастрофой).

Запомните состояние программы до возникновения проблемы и дайте пользователю возможность легко вернуться в это состояние. Всегда пишите функции, которые возвращают статус выполнения и используйте уникальный код ответа для каждой проблемной ситуации. Если возвращается код ответа, который свидетельствует о возникновении проблемы, обычно удаётся собрать достаточно информации, которую можно передать ответственным за исправление ошибки специалистам. С другой стороны, помните, что внутренние сбои в работе программы, с которыми она может справиться самостоятельно, не должны беспокоить пользователя, поэтому сообщения о таких ошибках не должны выводиться без крайней необходимости. Также в сообщении нужно четко разграничить информацию, предназначенную для пользователя, и необходимую для сотрудников техподдержки.

Читайте также:
Программа которая автоматически меняет ip адрес компьютера

Как выглядит корректно составленное сообщение об ошибке?

Сообщение об ошибке должно:

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

Хороший пример

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

«Система ATS потеряла связь с принтером. Для решения проблемы убедитесь, что принтер включен, и попробуйте запустить печать снова. Если напечатать документ не удается, убедитесь, что оба конца кабеля, соединяющего компьютер с принтером, надежно соединены с устройствами, и попробуйте снова запустить печать. Если и в этом случае проблема не устранена, свяжитесь с Джо Грантом по номеру (212) 555-1212 и сообщите ему, что программа выдает ошибку ATSPR35 в строке 31, модуль PRNFNC»

Это сообщение программы по подбору персонала (называется «Система ATS»), созданной независимым разработчиком для кадрового агентства в 1988. Сообщение выглядит почти так, как я описал выше. Существенным отличием является то, что оно не имеет привычный вид окна Windows, потому что это сообщение из программы DOS. Я упоминаю об этом, потому что это сообщение было составлено во времена, когда объем памяти ограничивался 640 Кб. У пользователей тогда не было большого опыта работы с компьютером, но даже если бы они были экспертами в этой области, все равно сообщение было бы полезным.

Давайте сравним это сообщение с требованиями, предложенными выше:

  • Сообщение совершенно четко идентифицирует программу. Более того, строка заголовка идентифицирует тип ошибки.
  • В сообщении сказано о том, что программа потеряла связь с принтером. В сообщении не говорится «невозможно напечатать», или «LPT1: Ошибка», или любой другой малоинформативный текст, скопированный из операционной системы. Сообщения об ошибке большинства операционных систем очень лаконичны и обычно для пользователя бесполезны. А это сообщение составлено так, что его может понять обычный пользователь.
  • В сообщении пользователю предлагаются действия, которые он способен выполнить, независимо от уровня или опыта владения программой. Здесь не высказываются догадки о причине ошибки. Предложенные действия располагаются от простого к более сложному, а причины – от более вероятных к менее вероятным. Отчасти здесь автору программы повезло – далеко не всегда самые распространенные ошибки проще всего исправить.
  • Программа не предлагает действий, которые будут пустой тратой времени. («Попробуйте перезапустить программу», или еще хуже, «Попробуйте переустановить приложение».)
  • Текст сообщения тщательно составлен. Важен каждый пункт сообщения. Нет бесполезных рекомендаций. Не предлагается искать причину сбоя в другом приложении. Вся информация точная и полезная.
  • Самое главное, в сообщении есть полезная техническая информация и для пользователя, и для сотрудника техподдержки, и для разработчика. Если ошибка содержится в коде, сообщение указывает программисту, где именно следует искать ошибку и тип ошибки. Немаловажный плюс – указание реального имени человека. Приятнее иметь дело с конкретным человеком, чем с абстрактной организацией, наличие имени программиста говорит об ответственности за свою работу.

10 примеров неудачных сообщений об ошибке

Теперь для контраста приведу несколько примеров худших сообщений об ошибке. Все примеры взяты из программ Microsoft. Конечно это не единственная компания, которая разрабатывает программное обеспечение c невнятным пользовательским интерфейсом, но она, без сомнения, преуспела в искусстве создания особо раздражающих диалоговых окон, сообщающих об ошибке.

«Невозможно загрузить список новых групп. Произошла ошибка»

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

Для программиста, ответственного за поддержку программы – а это обычно не тот человек, который писал исходный код – в данном сообщении нет даже намека на то, что вызвало ошибку, не говоря уже о коде ошибки вызванной функции. Если подобное сообщение выводится в результате разных ошибок, нет никакой возможности определить, какая из них произошла в данный момент.

К этому сообщению у меня вообще нет комментариев.

К этому тоже. Хотя оно выглядит не таким грозным как предыдущее.

«Интерфейс передачи сообщений вернул неизвестную ошибку. Если проблема повторяется, перезапустите Outlook»

Вам известно больше, чем вы сообщаете, и вы что-то скрываете? И кстати, как именно может помочь перезапуск Outlook?

«Переключение из режима Internet Only E-mail Service в режим Corporate or Workgroup E-mail Service может быть несовместимо с существующими приложениями»

Какими приложениями? В чём выражается несовместимость? Почему вы не устранили эту несовместимость? Ну, ещё повезло, что программа хотя бы не будет несовместима с несуществующими приложениями.

«Невозможно запустить программу. Возможно, один из компонентов занят или отсутствует. Пожалуйста, проверьте, правильность установки и попробуйте еще раз».

«Возможно». Компонент занят или отсутствует, или и то и другое? Если компонент используется, то какой именно компонент? Файл? Если так, можно узнать имя файла?

Читайте также:
Не работают почтовые программы

«Действие не может быть выполнено. Действие не может быть выполнено».

Правда? Правда? Какое действие? Какое действие? Что я должен сделать, чтобы устранить проблему?

Что я должен сделать, чтобы устранить проблему?

«Невозможно найти файл cuecard.hlp. Хотите найти файл вручную?»

Нет, не хочу. Я хочу, чтобы вы его нашли.

«Невозможно найти файл cuecard.hlp. Проверьте наличие файла на вашем диске. Если файл не будет найден, переустановите его».

Может, все-таки поищете, нет? Честно говоря, я не помню ситуацию, при которой я получил это сообщение, соответственно не помню и программу, которая его вывела. Тем не менее, я помню, что и тогда мне было непонятно, что мне следует переустановить.

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

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

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

Поэтому очень важно при написании сообщений помнить о конечном пользователе; о том, что программой будут пользоваться другие люди; о том, что каждое сообщение об ошибке программист составляет не только для себя. Пользователь не обязан знать программу во всех деталях. Предоставляемая информация должна быть подробной и понятной. Сообщение не должно ставить пользователя в тупик.

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

Такие коды помогают выявить причину ошибки, а также облегчают тестирование локализованных версий. Документируйте эти коды ошибок, и в сообщение включите информацию о том, где находится эта документация, чтобы помочь техподдержке. Убедитесь, что в программе есть механизм для идентификации отсутствующих файлов, записей реестра и т. д. Создайте классы и функции обработки ошибок, чтобы получить систематизированные, корректно оформленные сообщения об ошибках – и постоянно используйте их в своей работе в дальнейшем. Проведите анализ кода, проверьте программу с другими разработчиками, чтобы убедиться, что программу легко читать и поддерживать, что в ней нет дефектов и она логически последовательна. Предоставьте тестировщикам инструменты для тестирования или программу, которая позволит просмотреть все сообщения об ошибках в вашей программе.

Прототипирование – полезная стратегия для работы с сообщениями об ошибках. Во время разработки программы создайте скелет для каждой функции. Пока вы не наполнили функции содержимым, оставьте все как есть и возвращайте положительный код возврата. Определите коды возвратов как символы – константы или значения перечислимого типа. Позже, когда вы будете наполнять функции (и когда будете проверять коды возврата на каждом этапе), определите отдельные коды для каждого типа ошибок.

Программировать сейчас, конечно, сложнее, чем раньше. С каждым днем нужно осваивать все больше новых технологий, языков программирования, различных смежных дисциплин. От разработчиков требуют писать код быстрее, это оставляет меньше времени для размышлений о дизайне. Однако программистам и менеджерам не стоит обманываться – никто в компании не захочет взять на себя ответственность за дефекты и ошибки в программе, уже переданной на тестирование (или, хуже того, пользователю). Поэтому разработчики и менеджеры должны в своем рабочем плане выделить время на проектирование и на отладку, при необходимости закладывать больше времени и предусмотреть дополнительную помощь, особенно в вопросах, не требующих программирования, например, таких как разработка интерфейса пользователя.

Представьте себя на месте пользователя, который столкнулся с проблемой – вряд ли техподдержка отреагирует немедленно. Когда вы составляете сообщение об ошибке, важно помнить, что содержащаяся в нём информация должна быть полезной. Полезная информация экономит время. Помните также о том, что сообщение будут читать не только пользователи.

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

И если код обработки ошибок можно написать только один раз, то поддержку нужно будет оказывать многократно – десятки, сотни, или даже тысячи раз. Сотрудничайте с техподдержкой, тестировщиками и авторами технической документации; задавайте вопросы, считайте расходы и пытайтесь оценить стоимость решения проблем, возникающих после выпуска продукта. Не забудьте учесть в своих расчетах снижение продаж. Если руководство вашей компании хочет быстрее выпустить продукт на рынок и отказывается выделить время на обработку ошибок, вежливо напомните о том, во сколько может обойтись такая политика.

Источник: www.software-testing.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru