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