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