Jump to content

Обработка исключений

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

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

Определение [ править ]

Определение исключения основано на наблюдении, что каждая процедура имеет предварительное условие , набор обстоятельств, при которых она завершится «нормально». [1] Механизм обработки исключений позволяет процедуре вызывать исключение. [2] если это условие нарушено, [1] например, если процедура была вызвана с ненормальным набором аргументов. Затем механизм обработки исключений обрабатывает исключение. [3]

Предварительное условие и определение исключения являются субъективными . Набор «нормальных» обстоятельств полностью определяется программистом, например, программист может счесть деление на ноль неопределенным и, следовательно, исключением, или разработать какое-то поведение, такое как возврат нуля или специальное значение «НУЛЕВОЕ ДЕЛЕНИЕ» (обходя необходимость для исключений). [4] Общие исключения включают недопустимый аргумент (например, значение находится за пределами домена функции ), [5] недоступный ресурс (например, отсутствующий файл, [6] ошибка сетевого диска, [7] или ошибки нехватки памяти [8] ), или что программа обнаружила нормальное состояние, требующее особого обращения, например внимания, конца файла. [9] Социальное давление оказывает большое влияние на объем исключений и использование механизмов обработки исключений, то есть «примеры использования, обычно встречающиеся в основных библиотеках, и примеры кода в технических книгах, журнальных статьях, дискуссионных онлайн-форумах и на форумах организации». стандарты кода». [10]

Обработка исключений решает проблему полупредикатов , поскольку механизм отличает нормальные возвращаемые значения от ошибочных. В языках без встроенной обработки исключений, таких как C, подпрограммам придется сигнализировать об ошибке каким-то другим способом, например, с помощью общего кода возврата и шаблона errno . [11] В широком смысле ошибки можно рассматривать как надлежащее подмножество исключений. [12] а явные механизмы ошибок, такие как errno, можно считать (подробными) формами обработки исключений. [11] Термин «исключение» предпочтительнее, чем «ошибка», поскольку он не подразумевает, что что-то не так - состояние, рассматриваемое как ошибка одной процедурой или программистом, может не рассматриваться так другим. [13]

Термин «исключение» может ввести в заблуждение, поскольку его оттенок «аномалии» указывает на то, что создание исключения является ненормальным или необычным. [14] хотя на самом деле возникновение исключения может быть нормальной и обычной ситуацией в программе. [13] Например, предположим, что функция поиска для ассоциативного массива выдает исключение, если с ключом не связано никакого значения. В зависимости от контекста это исключение «отсутствие ключа» может возникать гораздо чаще, чем успешный поиск. [15]

История [ править ]

Первая аппаратная обработка исключений была обнаружена в UNIVAC I 1951 года. Арифметическое переполнение выполнило две инструкции по адресу 0, которые могли передать управление или исправить результат. [16] Программная обработка исключений была разработана в 1960-х и 1970-х годах. Обработка исключений впоследствии получила широкое распространение во многих языках программирования, начиная с 1980-х годов.

Аппаратные исключения [ править ]

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

плавающей запятой Исключения с IEEE 754

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

По умолчанию исключение IEEE 754 является возобновляемым и обрабатывается путем замены различных исключений предопределенным значением, например, бесконечностью для исключения деления на ноль, и предоставления флагов состояния для последующей проверки того, произошло ли исключение ( в языке программирования C99) типичный пример см. . пример обработки исключений IEEE 754). Стиль обработки исключений, реализуемый с помощью флагов состояния, включает в себя: сначала вычисление выражения с использованием быстрой и прямой реализации; проверка того, произошел ли сбой, путем проверки флагов состояния; а затем, при необходимости, вызвать более медленную, более устойчивую в цифровом отношении реализацию. [18]

В стандарте IEEE 754 термин «перехват» используется для обозначения вызова пользовательской процедуры обработки исключений в исключительных условиях и является дополнительной функцией стандарта. Стандарт рекомендует для этого несколько сценариев использования, включая реализацию нестандартной предварительной замены значения с последующим возобновлением, чтобы лаконично обрабатывать удаляемые особенности . [18] [19] [20]

Поведение обработки исключений IEEE 754 по умолчанию, заключающееся в возобновлении работы после предварительной замены значения по умолчанию, позволяет избежать рисков, присущих изменению потока программного управления для числовых исключений. Например, запуск космического корабля Cluster в 1996 году закончился катастрофическим взрывом, отчасти из-за политики обработки исключений Ada , заключающейся в прекращении вычислений из-за арифметической ошибки. Уильям Кахан утверждает, что поведение обработки исключений IEEE 754 по умолчанию предотвратило бы это. [19]

В языках программирования [ править ]

В компьютерном программировании существует несколько языковых механизмов для обработки исключений . Термин «исключение» обычно используется для обозначения структуры данных, хранящей информацию об исключительном состоянии. Один из механизмов передачи управления или возникновения исключения известен как throw ; Говорят, что исключение выброшено . Исполнение передается в catch .

В пользовательских интерфейсах [ править ]

Фреймворки интерфейсной веб-разработки , такие как React и Vue , ввели механизмы обработки ошибок, при которых ошибки распространяются вверх по иерархии компонентов пользовательского интерфейса (UI) аналогично тому, как ошибки распространяются вверх по стеку вызовов при выполнении кода. [21] [22] Здесь механизм границы ошибки служит аналогом типичного механизма try-catch. Таким образом, компонент может гарантировать, что ошибки его дочерних компонентов будут перехватываться и обрабатываться, а не распространяться на родительские компоненты.

Например, в Vue компонент будет обнаруживать ошибки, реализуя errorCaptured

Vue.component('parent', {    template: '<div><slot></slot></div>',    errorCaptured: (err, vm, info) => alert('An error occurred');})Vue.component('child', {    template: '<div>{{ cause_error() }}</div>'})

При таком использовании в разметке:

<parent>    <child></child></parent>

Ошибка, вызванная дочерним компонентом, перехватывается и обрабатывается родительским компонентом. [23]

См. также [ править ]

Ссылки [ править ]

  1. ^ Jump up to: Перейти обратно: а б Кристиан, Флавиу (1980). «Обработка исключений и отказоустойчивость программного обеспечения». Учеб. 10-й Международный. Симп. Об отказоустойчивых вычислениях (6) (переиздание FTCS-25): 531–540. CiteSeerX   10.1.1.116.8736 . дои : 10.1109/TC.1982.1676035 . OCLC   1029229019 . S2CID   18345469 .
  2. ^ Гуденаф 1975b , стр. 683–684.
  3. ^ Гуденаф 1975b , с. 684.
  4. ^ Блэк 1982 , стр. 13–15.
  5. ^ Китон, Каванесс и Фризен 2001 : ArrayIndexOutOfBoundsException
  6. ^ Китон, Каванесс и Фризен 2001 : FileNotFoundException
  7. ^ «Необычное сообщение об ошибке: java.io.SyncFailedException: синхронизация не удалась» . groups.google.com . Проверено 17 ноября 2023 г.
  8. ^ «Понимание исключения OutOfMemoryError» . docs.oracle.com . Проверено 17 ноября 2023 г.
  9. ^ Ява: FileNotFoundException
  10. ^ Кинири, младший (2006). «Исключения в Java и Eiffel: две крайности в разработке и применении исключений». Расширенные темы по методам обработки исключений (PDF) . Конспекты лекций по информатике. Том. 4119. стр. 288–300. дои : 10.1007/11818502_16 . ISBN  978-3-540-37443-5 . S2CID   33283674 .
  11. ^ Jump up to: Перейти обратно: а б Ланг, Джун; Стюарт, Дэвид Б. (март 1998 г.). «Исследование применимости существующих методов обработки исключений к компонентной технологии программного обеспечения реального времени». Транзакции ACM в языках и системах программирования . 20 (2): 276. CiteSeerX   10.1.1.33.3400 . дои : 10.1145/276393.276395 . S2CID   18875882 . Вероятно, наиболее распространенной формой метода обработки исключений, используемой программистами, является метод «кода возврата», который был популяризирован как часть C и UNIX.
  12. ^ Левин 1977 , с. 5.
  13. ^ Jump up to: Перейти обратно: а б Лисков, Б.Х.; Снайдер, А. (ноябрь 1979 г.). «Обработка исключений в CLU» (PDF) . Транзакции IEEE по разработке программного обеспечения . СЭ-5 (6): 546–558. дои : 10.1109/TSE.1979.230191 . S2CID   15506879 . Проверено 19 декабря 2021 г.
  14. ^ «Результаты тезауруса для ИСКЛЮЧЕНИЯ» . www.merriam-webster.com . Проверено 17 ноября 2023 г.
  15. ^ Левин 1977 , с. 4.
  16. ^ Смозерман, Марк. «Прерывает» . Проверено 4 января 2022 г.
  17. ^ Хайд, Рэндалл. «Искусство сборки: Глава семнадцатая» . www.plantation-productions.com . Проверено 22 декабря 2021 г.
  18. ^ Jump up to: Перейти обратно: а б Сяое Ли ; Джеймс Деммел (1994). «Более быстрые числовые алгоритмы посредством обработки исключений, транзакции IEEE на компьютерах, 43 (8)»: 983–992. {{cite journal}}: Для цитирования журнала требуется |journal= ( помощь )
  19. ^ Jump up to: Перейти обратно: а б В.Кахан (5 июля 2005 г.). «Демонстрация предварительной замены ∞/∞» (PDF) . Архивировано (PDF) из оригинала 10 марта 2012 г.
  20. ^ Хаузер, Джон Р. (март 1996 г.). «Обработка исключений с плавающей запятой в числовых программах» . Транзакции ACM в языках и системах программирования . 18 (2): 139–174. дои : 10.1145/227699.227701 . S2CID   9820157 .
  21. ^ «Границы ошибок» . Реагируйте . Проверено 10 декабря 2018 г.
  22. ^ «API Vue.js» . Vue.js. ​Проверено 10 декабря 2018 г.
  23. ^ «Обработка ошибок с помощью Vue.js» . CatchJS . Проверено 10 декабря 2018 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: b3e5aa8b6b565eb5a5a1fa8bbef6e982__1701393120
URL1:https://arc.ask3.ru/arc/aa/b3/82/b3e5aa8b6b565eb5a5a1fa8bbef6e982.html
Заголовок, (Title) документа по адресу, URL1:
Exception handling - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)