stringtranslate.com

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

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

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

Определение

Определение исключения основано на наблюдении, что каждая процедура имеет предусловие , набор обстоятельств, при которых она завершится «нормально». [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 .

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

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

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

Vue.component ( 'parent' , { template : '<div> <slot> </slot></div>' , errorCaptured : ( err , vm , info ) => alert ( 'Произошла ошибка' ); }) Vue.component ( ' child' , { template : ' <div> { { cause_error()}}</div>' })            

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

< родитель >  < ребенок ></ ребенок > </ родитель >

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

Смотрите также

Ссылки

  1. ^ ab Cristian, Flaviu (1980). «Обработка исключений и отказоустойчивость программного обеспечения». Proc. 10th Int. Symp. On Fault Tolerant Computing (6) (FTCS-25 reprint ed.): 531–540. CiteSeerX  10.1.1.116.8736 . doi :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. ^ Kiniry, JR (2006). «Исключения в Java и Eiffel: две крайности в разработке и применении исключений». Advanced Topics in Exception Handling Techniques (PDF) . Lecture Notes in Computer Science. Vol. 4119. pp. 288–300. doi :10.1007/11818502_16. ISBN 978-3-540-37443-5. S2CID  33283674.
  11. ^ ab Lang, Jun; Stewart, David B. (март 1998 г.). "Исследование применимости существующих методов обработки исключений к компонентно-ориентированной технологии программного обеспечения реального времени". ACM Transactions on Programming Languages ​​and Systems . 20 (2): 276. CiteSeerX 10.1.1.33.3400 . doi :10.1145/276393.276395. S2CID  18875882. Возможно, наиболее распространенной формой метода обработки исключений, используемой программистами, является метод "кода возврата", который был популярен как часть C и UNIX. 
  12. Левин 1977, стр. 5.
  13. ^ ab Лисков, Б. Х.; Снайдер, А. (ноябрь 1979 г.). «Обработка исключений в CLU» (PDF) . IEEE Transactions on Software Engineering . SE-5 (6): 546–558. doi :10.1109/TSE.1979.230191. S2CID  15506879 . Получено 19 декабря 2021 г. .
  14. ^ "Результаты тезауруса для ИСКЛЮЧЕНИЯ". www.merriam-webster.com . Получено 17 ноября 2023 г. .
  15. ^ Левин 1977, стр. 4.
  16. ^ Smotherman, Mark. "Interrupts" . Получено 4 января 2022 г.
  17. ^ Хайд, Рэндалл. «Искусство сборки: Глава семнадцатая». www.plantation-productions.com . Получено 22 декабря 2021 г. .
  18. ^ ab Xiaoye Li ; James Demmel (1994). «Более быстрые численные алгоритмы с помощью обработки исключений», IEEE Transactions on Computers, 43(8)": 983–992. {{cite journal}}: Цитировать журнал требует |journal=( помощь )
  19. ^ ab W.Kahan (5 июля 2005 г.). "Демонстрация предварительной подстановки для ∞/∞" (PDF) . Архивировано (PDF) из оригинала 10 марта 2012 г.
  20. ^ Хаузер, Джон Р. (март 1996 г.). «Обработка исключений с плавающей точкой в ​​числовых программах». Труды ACM по языкам и системам программирования . 18 (2): 139–174. doi : 10.1145/227699.227701 . S2CID  9820157.
  21. ^ "Границы ошибок". React . Получено 2018-12-10 .
  22. ^ "Vue.js API". Vue.js . Получено 2018-12-10 .
  23. ^ "Обработка ошибок с помощью Vue.js". CatchJS . Получено 2018-12-10 .

Внешние ссылки