Для отслеживания и обработки специальных, внештатных или ошибочных ситуаций, возникающих в процессе работы компьютерных программ под управлением современных операционных систем, используется механизм исключений. Исключения бывают аппаратными (возбуждаются процессором) и программными (инициируются самим приложением или какими-либо подключаемыми внешними компонентами).
Вне зависимости от типа, исключение может быть перехвачено и корректно обработано. Не перехваченные исключения попадают в корневой обработчик библиотеки времени исполнения или обработчик, устанавливаемый операционной системой. Если это случилось, программа «вылетает» с отображением сообщения или окна аварийного завершения (в Windows). Если обработчик операционной системы не сработал (например, был умышленно удален), программа «падает молча». Таким образом, программы «вылетают» вследствие возникновения исключений, которые не могут быть обработаны. Причины же возникновения исключений - различны.
В подавляющем большинстве случаев программы «вылетают» вследствие исполнения их собственного кода, содержащего явные или неявные ошибки реализации. Перечень возможных причин возникновения внештатных ситуаций весьма велик. Это и классические ошибки операций над числами с плавающей точкой (например, деление на 0), и ошибки работы с памятью (чтение или запись за границами адресного пространства процесса, доступ к защищенным страницам, запись в области памяти, предназначенные только для чтения), переполнение стека вследствие бесконечной рекурсии, и т.д. В этих случаях генерируются аппаратные исключения или исключения операционной системы.
К неявным ошибкам можно отнести различные случаи недостаточной фильтрации входных данных, отсутствие проверок значений указателей и многое другое. Такие недочеты приводят к возникновению исключительных ситуаций только в определенных случаях.
Ошибки реализации могут содержаться и во внешних компонентах, используемых приложением. Например, в динамических библиотеках, обеспечивающих необходимый функционал или модулях дополнений. Программный код, неявно загружаемый в адресное пространство процесса (например, с целью перехвата определенных API-функций), также может стать причиной «падения» программы.
Многие компоненты и библиотеки (например, ADO в Windows) используют механизм программных исключений как приоритетный способ сообщения об ошибках. Отсутствие или недостаточно полная обработка исключений подобного рода приложением может привести к его аварийному завершению даже в совершенно безобидных ситуациях (таких как потеря подключения к базе данных).