Преобразование исключений в операции с плавающей запятой в исключения C++

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

7
задан Geoffrey Irving 17 September 2008 в 17:40
поделиться

5 ответов

Если Ваша поддержка внедрения библиотеки стандарта C++ функции TR1 fetestexcept, feraiseexcept и feclearexcept (мой еще не делает, таким образом, я не могу протестировать это), можно обнаружить пять видов ошибок с плавающей точкой, и затем можно выдать любые исключения, которые Вы хотите.

Посмотрите здесь для описания этих функций.

Я также рекомендую раздел 12.3, "Управляя Средой С плавающей точкой", из книги Расширения Библиотеки Стандарта C++: Учебное руководство и Ссылка Pete Becker, ISBN-13: 9780321412997, для превосходного описания этих функций с примером кода.

alt text

8
ответ дан 6 December 2019 в 14:12
поделиться

Из-за пути сигналы и работа исключений, Вы не можете сделать этого сразу, когда сигнал брошен - исключения полагаются на определенные аспекты стека, которые не верны, когда обработчик сигналов называют.

Можно установить глобальную переменную в обработчике сигналов, и затем проверить это в ключевых пунктах в программе и выдать исключение, если это установлено. Это не дает Вам точную информацию о вызванной исключительной ситуации, все же.

3
ответ дан 6 December 2019 в 14:12
поделиться

У меня нет готового решения, но одной вещью, на которую Вы могли посмотреть, являются сигналы (не уверенный, можно ли безопасно бросить исключения C++ от них, но она должна помочь для отладки так или иначе.)

Вы могли установить обработчик сигналов для SIGFPE и использование это для Вашей отладки целей.

1
ответ дан 6 December 2019 в 14:12
поделиться

gcc опция-fnon-call-exceptions могла бы быть несколько полезной Вам. Не удалось найти документацию относительно него, хотя, таким образом, Ваш пробег может варьироваться.

3
ответ дан 6 December 2019 в 14:12
поделиться

Основная идея будет состоять в том, чтобы Вы установили соответствующие обработчики сигналов для исключений в операции с плавающей запятой. В Вашем обработчике сигналов можно выдать исключение (или отправить пользовательский сигнал в другой процесс, который повысит исключение или отправит сообщение в другой поток для чего-то подобного, и т.д. и т.д. и т.д.). Существует любое количество способов на самом деле выдать исключение - главное состоит в том, чтобы обработать сигнал.

0
ответ дан 6 December 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: