В общем, исключение с плавающей запятой является примером более общего класса исключений. Специфика будет варьироваться от машины к машине.
Существует ряд вещей, которые могут «убить» вашу программу, и все они могут быть классифицированы как исключения в этом отношении:
- доступ к несуществующей памяти
- неправильный доступ к памяти (смещение, запись только для чтения и т. Д.)
- делить на 0
- недопустимая инструкция
- превышен лимит ресурсов (например, время процессора)
- арифметическое переполнение
В Unix-подобных операционных системах доступ к несуществующей памяти обычно является «нарушением сегментации», в то время как неправильный доступ к памяти обычно является «ошибкой шины». (Под Windows они являются / были нарушением общей защиты и / или BSOD .)
И, как вы можете видеть, хотя деление на 0 является исключением, оно является братом нарушения сегментации, а не подмножеством.
(Я перечислил арифметическое переполнение как исключение, потому что оно может быть, а не потому, что обычно так и есть. Большинство современных систем, конечно, не рассматривают переполнение как исключение. Но по правилам C они могут, за исключением переполнения на целых числах без знака, которые необходимы для C, чтобы быть определенными и хорошо себя вести.)
В Unix-подобных операционных системах большинство / все эти исключения, как правило, сопоставляются с сигналами , которые ваша программа может перехватить, чтобы она могла (пытаться) продолжать, а не умирать.
(По иронии судьбы, в системе, где я только что попробовал, integer деление на 0 дает мне "исключение с плавающей точкой", в то время как деление с плавающей точкой на 0 дает IEEE -754 inf
, что вовсе не исключение. Но это другой вопрос .)