Дискуссия о статусе фатальных предупреждений

Темы:

В рассылке perl5-porters активно обсуждается проблема фатальных предупреждений. Как известно, при использовании конструкции

use warnings FATAL => 'all';

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

Первая причина касается использования фатальных предупреждений в библиотеках. Поскольку с каждым выходом новой версии Perl могут появляться новые предупреждения, то использование фатальных предупреждений может ломать работу приложений, которые зависят от этой библиотеки. И чем популярнее библиотека, там серьёзнее возникающий разлом. Хорошим примером выступает модуль Moo, который становится всё более популярным, вследствие чего была пересмотрена политика относительно фатализации предупреждений, и в версии 2.0 их больше не будет.

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

  • Тяжёлый крах приложения
  • Утечки памяти (при компиляции и во время выполнения)
  • Проблемы при использовании fork
  • Ошибки при работе с файловыми дескрипторами
  • Искажение реальных сообщений об ошибках
  • Проблемы с фатальным ошибками при работе с Юникодом

Часть этих проблем исправлено в последних версиях Perl, но часть по-прежнему висит в подвешенном состоянии. Т.е. речь идёт о том, что использование фатальных предупреждений может быть небезопасно даже при традиционном использовании механизма eval для перехвата исключений.

Дэвид Голден предложил официально объявить фатальные предупреждения нерекомендуемой практикой, но Рикардо Сигнес предложил пока не торопиться и продолжить обсуждение. В тесте POD-документации модуля warnings по-прежнему есть лишь только предупреждение о рисках использования фатальных предупреждений, как источника вероятных проблем при сопровождении в будущем.