Является ли `eval`ing в модуле CPAN без локализации $ @ ошибкой? - PullRequest
12 голосов
/ 01 июня 2010

Я думаю, что столкнулся с ошибкой в ​​ Params :: Validate , но я не уверен, правильно ли я определил проблемный фрагмент кода. В рассматриваемом коде не удалось передать исключения по цепочке (используя Try :: Tiny ), поэтому я начал отладку и обнаружил, что класс, используемый внутри блока try, имеет деструктор. Этот деструктор вызывает методы объекта, которые используют Params::Validate и ищут Validate.pm source Я вижу eval без $@ локализации, то есть глобальный $@ перезаписывается.

Теперь я вижу два варианта:

  1. Params::Validate всегда должен локализовать $@, поэтому об ошибке следует сообщать.
  2. Ошибка в рассматриваемом классе, потому что она не должна использовать Params::Validate в деструкторе. Params::Validate может остаться таким, как есть сейчас.

Какой это? Как мне справиться с этой ситуацией?

PS: Я думаю, что модули CPAN должны быть надежными и не разрушать ни себя, ни свое окружение, отсюда и название вопроса.

Ответы [ 2 ]

11 голосов
/ 01 июня 2010

См. http://search.cpan.org/perldoc?Params::Validate#SUPPORT о том, как отправить отчет об ошибке. Вы потратили много энергии на выяснение причины и решение проблемы. Было бы стыдно, если бы кто-то еще повторил ваши шаги, не зная, что вы уже узнали.

Я думаю, что модули CPAN должны быть надежными и не разрушать ни себя, ни окружающую среду

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

Params::Validate был выпущен девять лет назад и с тех пор обновлялся примерно 94 раза. Если вы посмотрите файл CHANGES, то увидите, что автор (ы) был весьма добросовестен в обновлении модуля, исправлении случайных проблем и добавлении новых функций. Вероятно, их не поразит тот факт, что пользователь обнаружил проблему, и вы не должны быть слишком шокированы, обнаружив, что некоторые библиотеки просто превосходны и не совершенны.

4 голосов
/ 01 июня 2010

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

Я думаю, что модули CPAN должны быть надежными и не разрушать ни себя, ни свое окружение, отсюда и название вопроса.

Это действительно что-нибудь сломало? Я могу сказать вам, что это ошибка, но я не могу сказать вам, что она извиняет вас за то, что вы не тестировали случаи, когда вы ожидали явного $@ и не имели его благодаря Params::Validate. Если это «нарушает» среду разработки, то для этого и нужно тестирование.

...