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 .

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

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

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

Вю . компонент ( 'parent' , { шаблон : '<div><slot></slot></div>' , errorCaptured : ( err , vm , info ) => alert ( 'Произошла ошибка' ); }) Vue . компонент ( 'дочерний' , { шаблон : '<div>{{ Cause_error() }}</div>' })            

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

< родительский >  < дочерний >/ дочерний > </ родительский >

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

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

Рекомендации

  1. ^ аб Кристиан, Флавиу (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. ^ Аб Ланг, Джун; Стюарт, Дэвид Б. (март 1998 г.). «Исследование применимости существующих методов обработки исключений к компонентной технологии программного обеспечения реального времени». Транзакции ACM в языках и системах программирования . 20 (2): 276. CiteSeerX 10.1.1.33.3400 . дои : 10.1145/276393.276395. S2CID  18875882. Вероятно, наиболее распространенной формой метода обработки исключений, используемой программистами, является метод «кода возврата», который был популяризирован как часть C и UNIX. 
  12. ^ Левин 1977, с. 5.
  13. ^ аб Лисков, BH; Снайдер, А. (ноябрь 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. ^ аб Сяое Ли ; Джеймс Деммел (1994). «Более быстрые числовые алгоритмы посредством обработки исключений, транзакции IEEE на компьютерах, 43 (8)»: 983–992. {{cite journal}}: Требуется цитировать журнал |journal=( помощь )
  19. ^ аб В.Кахан (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 г.

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