Обработка исключений
В вычислительной технике и компьютерном программировании обработка исключений — это процесс реагирования на возникновение — аномальных или исключительных условий, требующих специальной обработки — во время выполнения программы исключений . Как правило, исключение нарушает нормальный поток выполнения и запускает заранее зарегистрированный обработчик исключений ; Подробности того, как это делается, зависят от того, является ли это аппаратным или программным исключением, а также от того, как это программное исключение реализовано.
Исключения определяются различными уровнями компьютерной системы, и типичными уровнями являются прерывания , определяемые операционной системой (ОС) , определяемые процессором, сигналы , исключения , определяемые языком программирования . Каждый уровень требует разных способов обработки исключений, хотя они могут быть взаимосвязаны, например, прерывание ЦП может быть преобразовано в сигнал ОС. Некоторые исключения, особенно аппаратные, могут обрабатываться настолько изящно, что выполнение может возобновиться там, где оно было прервано.
Определение
[ редактировать ]Определение исключения основано на наблюдении, что каждая процедура имеет предварительное условие , набор обстоятельств, при которых она завершится «нормально». [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]
В языках программирования
[ редактировать ]В пользовательских интерфейсах
[ редактировать ]Фреймворки интерфейсной веб-разработки , такие как 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]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ 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 .
- ^ Гуденаф 1975b , стр. 683–684.
- ^ Гуденаф 1975b , с. 684.
- ^ Блэк 1982 , стр. 13–15.
- ^ Китон, Каванесс и Фризен 2001 :
ArrayIndexOutOfBoundsException
- ^ Китон, Каванесс и Фризен 2001 :
FileNotFoundException
- ^ «Необычное сообщение об ошибке: java.io.SyncFailedException: синхронизация не удалась» . groups.google.com . Проверено 17 ноября 2023 г.
- ^ «Понимание исключения OutOfMemoryError» . docs.oracle.com . Проверено 17 ноября 2023 г.
- ^ Ява:
FileNotFoundException
- ^ Кинири, младший (2006). «Исключения в Java и Eiffel: две крайности в разработке и применении исключений». Расширенные темы по методам обработки исключений (PDF) . Конспекты лекций по информатике. Том. 4119. стр. 288–300. дои : 10.1007/11818502_16 . ISBN 978-3-540-37443-5 . S2CID 33283674 .
- ^ Jump up to: а б Ланг, Джун; Стюарт, Дэвид Б. (март 1998 г.). «Исследование применимости существующих методов обработки исключений к компонентной технологии программного обеспечения реального времени». Транзакции ACM в языках и системах программирования . 20 (2): 276. CiteSeerX 10.1.1.33.3400 . дои : 10.1145/276393.276395 . S2CID 18875882 .
Вероятно, наиболее распространенной формой метода обработки исключений, используемой программистами, является метод «кода возврата», который был популяризирован как часть C и UNIX.
- ^ Левин 1977 , с. 5.
- ^ Jump up to: а б Лисков, Б.Х.; Снайдер, А. (ноябрь 1979 г.). «Обработка исключений в CLU» (PDF) . Транзакции IEEE по разработке программного обеспечения . СЭ-5 (6): 546–558. дои : 10.1109/TSE.1979.230191 . S2CID 15506879 . Проверено 19 декабря 2021 г.
- ^ «Результаты тезауруса для ИСКЛЮЧЕНИЯ» . www.merriam-webster.com . Проверено 17 ноября 2023 г.
- ^ Левин 1977 , с. 4.
- ^ Смотерман, Марк. «Прерывает» . Проверено 4 января 2022 г.
- ^ Хайд, Рэндалл. «Искусство сборки: Глава семнадцатая» . www.plantation-productions.com . Проверено 22 декабря 2021 г.
- ^ Jump up to: а б Сяое Ли ; Джеймс Деммел (1994). «Более быстрые числовые алгоритмы посредством обработки исключений, транзакции IEEE на компьютерах, 43 (8)»: 983–992.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б В.Кахан (5 июля 2005 г.). «Демонстрация предварительной замены ∞/∞» (PDF) . Архивировано (PDF) из оригинала 10 марта 2012 г.
- ^ Хаузер, Джон Р. (март 1996 г.). «Обработка исключений с плавающей запятой в числовых программах» . Транзакции ACM в языках и системах программирования . 18 (2): 139–174. дои : 10.1145/227699.227701 . S2CID 9820157 .
- ^ «Границы ошибок» . Реагируйте . Проверено 10 декабря 2018 г.
- ^ «API Vue.js» . Vue.js. Проверено 10 декабря 2018 г.
- ^ «Обработка ошибок с помощью Vue.js» . CatchJS . Проверено 10 декабря 2018 г.
- Блэк, Эндрю П. (январь 1982 г.). Обработка исключений: дело против (PDF) (доктор философии). Оксфордский университет. CiteSeerX 10.1.1.94.5554 . OCLC 123311492 .
- Габриэль, Ричард П .; Стил, Гай Л. (2008). Модель эволюции языка (PDF) . LISP50: Празднование 50-летия Lisp. стр. 1–10. дои : 10.1145/1529966.1529967 . ISBN 978-1-60558-383-9 .
- Гуденаф, Джон Б. (1975a). Структурированная обработка исключений . Материалы 2-го симпозиума ACM SIGACT-SIGPLAN по принципам языков программирования - POPL '75. стр. 204–224. дои : 10.1145/512976.512997 .
- Гуденаф, Джон Б. (1975). «Обработка исключений: проблемы и предлагаемые обозначения» (PDF) . Коммуникации АКМ . 18 (12): 683–696. CiteSeerX 10.1.1.122.7791 . дои : 10.1145/361227.361230 . S2CID 12935051 .
- Левин, Рой (июнь 1977 г.). Структуры программ для работы в исключительных условиях (PDF) (доктор философии). Университет Карнеги-Меллон. ДТИК ADA043449 . Архивировано (PDF) из оригинала 22 декабря 2021 г.
- Страуструп, Бьярн (1994). Проектирование и эволюция C++ (1-е изд.). Ридинг, Массачусетс: Аддисон-Уэсли. ISBN 0-201-54330-3 .
- Уайт, Джон Л. (май 1979 г.). НИЛ — Перспектива (PDF) . Материалы конференции пользователей Macsyma 1979 года.
- Китон, Брайан; Каванесс, Чак; Фризен, Джефф (2001). Специальная версия с использованием стандартной версии Java 2 . Издательство Que. ISBN 978-0-7897-2468-7 .
Внешние ссылки
[ редактировать ]- Ускоренный курс по глубине структурированной обработки исключений Win32, Мэтт Питрек - Microsoft Systems Journal (1997)
- Статья « Обработка исключений C++ », Кристоф де Динешен
- Статья « Исключительные практики » Брайана Гетца
- Статья « Объектно-ориентированная обработка исключений в Perl », Арун Удая Шанкар
- Статья « Программирование с исключениями на C++ ». Кайла Лаудона
- Статья « Непроверенные исключения – полемика »
- Слайды конференции: Политика обработки исключений с плавающей запятой (pdf, стр. 46) , Уильям Кахан
- Описания из репозитория шаблонов Портленда
- Нужны ли Java проверяемые исключения?