Обработка деления на ноль в графическом коде

Я пишу библиотеку для процедурной генерации изображений (Clisk), которая позволяет пользователям определять свои собственные математические функции для генерировать изображения.

Очевидно, что они могут определить функцию, которая может привести к делению на ноль для некоторых пикселей, например. (псевдокод)

red = 1.0 / (xposition - 0.5)

Это приведет к делению на ноль всякий раз, когда xposition = 0,5 (середина изображения).

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

Что было бы хорошим, надежным, систематическим подходом к рассмотрению этих случаев?


person mikera    schedule 23.05.2012    source источник
comment
Возможно, вы могли бы объяснить немного больше: если пользователь портит свою функцию, почему вас это особенно волнует? Почему бы просто не сделать так, чтобы ваш код перехватывал Exception и повторно вызывал исключение UserDefinedCodeBuggeredUpException?   -  person Neil Coffey    schedule 23.05.2012
comment
Есть более новый вопрос по аналогичной теме, которому уделяется много внимания: Каково самое быстрое целочисленное деление, поддерживающее деление на ноль, независимо от результата?   -  person hippietrail    schedule 02.06.2013


Ответы (3)


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

(Я предполагаю, что вы имеете в виду, что фрагмент кода является примером некоторого пользовательского кода...)

Ясно, что если пользовательский код может генерировать исключения, вы не можете остановить это. (А совет проверять перед делением явно неактуален... к вам.)

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

Вы, конечно, не можете добраться и исправить его / ее код Java. (И если этот фрагмент должен быть кодом, написанным на каком-то специальном языке, то вы не сможете его исправить. Вы/ваша библиотека не знаете, что должен предоставленный пользователем код. делать...)

Нет. Я считаю, что лучший ответ состоит в том, чтобы обернуть любые неожиданные (непроверенные) исключения, исходящие из кода, предоставленного пользователем, в ваше собственное исключение, которое ясно сообщает пользователю, что ошибка произошла в его коде. . Затем код приложения, вызывающий код вашей библиотеки, решает, обрабатывать ли исключение или «сбой».


Если вы просите пользователей о «хорошем, надежном, систематическом подходе» к написанию своих функций, я думаю, вы ошибаетесь. И это не совсем ваша забота...

person Stephen C    schedule 23.05.2012

Я на самом деле не программист графики, но вы могли бы сделать

 private static final double MIN_X = 0.0000001

 red = 1.0 / Math.max(xpos - 0.5, MIN_X);

Очевидно, вам, вероятно, придется добавить абсолютное значение, если вы разрешаете отрицательные значения.

person jeff    schedule 23.05.2012

Вы всегда можете просто указать параметр, спрашивая, что делать при делении на ноль. В конце концов, это их кодекс — они должны знать, что лучше для их случая.

Тогда возникает вопрос, какое разумное значение по умолчанию для этого параметра? Я бы сказал, что "вернуть 0.0" или "сгенерировать исключение" подходят для этого приложения. Просто убедитесь, что вы задокументировали это.

person BlueRaja - Danny Pflughoeft    schedule 23.05.2012