Поднятие исключения может быть либо чистым, либо не чистым, оно просто зависит от типа исключения, которое возникает. Хорошим правилом большого пальца является то, что если исключение выражается кодом, оно чистое, но если оно возникает аппаратным обеспечением, то его обычно следует классифицировать как нечистое.
Это можно увидеть, посмотрев, что происходит, когда возникает исключение аппаратного обеспечения: сначала возникает сигнал прерывания, затем запускается обработчик прерываний. Проблема здесь в том, что обработчик прерываний не был аргументом вашей функции и не указан в вашей функции, а глобальная переменная. Всякий раз, когда глобальная переменная (aka state) читается или записывается, у вас больше нет чистой функции.
Сравните это с тем исключением, которое возникает в вашем коде: вы строите значение Исключения из набора известных, локально ограниченных аргументов или констант, и вы «бросаете» результат. Глобальных переменных не используется. Процесс выброса исключения - это, по сути, синтаксический сахар, предоставляемый вашим языком, он не вводит какое-либо недетерминированное или нечистое поведение. Как сказал Дон, «он должен быть семантически эквивалентен использованию типа Maybe или Option», что означает, что он также должен иметь все те же свойства, включая чистоту.
Когда я сказал, что повышение аппаратного исключения «обычно» классифицируется как побочный эффект, это не всегда так. Например, если компьютер, на котором работает ваш код, не вызывает прерывание, когда он вызывает исключение, но вместо этого накладывает специальное значение на стек, тогда он не классифицируется как нечистый. Я считаю, что ошибка NAN с плавающей точкой IEEE сбрасывается с использованием специального значения, а не прерывания, поэтому любые исключения, возникающие при выполнении математики с плавающей запятой, могут быть классифицированы как побочные эффекты бесплатно, поскольку значение не считывается из какого-либо глобального состояния, но константа, закодированная в FPU.
Посмотрите на все требования к чистому фрагменту кода, исключения на основе кода и инструкцию throw синтаксического сахара отметьте все поля, они не изменяют какое-либо состояние, они не имеют никакого взаимодействия с их вызывающими функциями или чем-либо вне их вызов, и они являются ссылочно прозрачными, но только после того, как компилятор имеет свой путь с вашим кодом.
Как и все чистые и нечеткие обсуждения, я исключил любое понятие времени выполнения или операций с памятью и работал в предположении, что любая функция, которая может быть реализована исключительно, реализована исключительно вне зависимости от ее фактической реализации. У меня также нет доказательств претензии IEEE с плавающей точкой NAN.
Исключение не просто возвращается как возвращаемое значение. – Sjoerd
Перемещение для повторного открытия это, безусловно, вопрос, в то время как более теоретический характер по-прежнему действителен для этого веб-сайта. – Woot4Moo
Он должен быть перенесен на [programers.se] – Daenyth