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


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

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

red = 1.0 / (xposition - 0.5)

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

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

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

3 2

3 ответа:

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

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

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

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

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

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


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

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

 private static final double MIN_X = 0.0000001

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

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

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

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