Intereting Posts
Категории исключений для пользовательских типов сообщений Обновление базы данных WordPress с 2,6 до 3,2 Как исключить категорию из цикла с массивом Azure WordPress site – URL-адреса, которые не отображаются при переходе из корневого каталога в подкаталог Пользователь Admin не может обновлять WP Поворотные фоновые изображения WordPress Получите идентификатор и slug от объекта таксономии WooCommerce создает шаблоны пользовательских категорий Загрузка страниц через Ajax и отображение названий Как ограничить страницы подменю плагина администратором / подписчиками? SQL для обновления пользовательских почтовых таксономий Скажите разницу между термином и страницей, если у них одинаковый идентификатор Как проверить уровень пользовательского сайта основного сайта с сайта в многопользовательской сети Как изменить дату публикации на основе настраиваемого поля? Как повлиять на главную страницу с помощью плагина

Когда использовать Исключения против Объектов Ошибок против простого ложного / нулевого

Я в процессе написания плагина, и я пытаюсь оценить, когда использовать разные подходы к обработке ошибок.

Есть три метода, которые я рассматриваю:

  • Выброс исключения (пользовательский класс)
  • Возврат объекта ошибки (расширение WP_Error)
  • Просто верните null / false

Некоторые ситуации, которые я рассматриваю

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

Предложения? Поскольку у написания плагина WordPress есть некоторые особые соображения, я не уверен, стоит ли спрашивать об этом на общей доске PHP.

Solutions Collecting From Web of "Когда использовать Исключения против Объектов Ошибок против простого ложного / нулевого"

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

Подумайте, что следующим является мой подход, и у меня нет презумпции, он правильный .

Я могу точно сказать, что вам следует избегать третьего варианта:

Просто верните null / false

Это плохо по разному аспекту:

  • возвращение типа consinstency
  • упрощает работу с модульными тестами
  • принудительная условная проверка на тип возврата ( if (! is_null($thing))... ) сделать код труднее читать

Я, чаще всего, использую OOP для создания плагинов кода, и мои объектные методы часто генерируют исключение, когда что-то идет не так.

Выполняя это, я:

  • достичь конъюнктуры типа возврата
  • сделать код простым для модульного теста
  • не требуется условная проверка возвращаемого типа

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

Чтобы избежать этой проблемы, у меня обычно есть «основная процедура», расположенная в основном файле плагина, которую я обернуваю в блок try / catch . Это дает мне шанс поймать исключение в производстве и предотвратить фатальную ошибку.

Примерный пример класса:

 # myplugin/src/Foo.php namespace MyPlugin; class Foo { /** * @return bool */ public function doSomething() { if ( ! get_option('my_plugin_everything_ok') ) { throw new SomethingWentWrongException('Something went wrong.'); } // stuff here... return true; } } 

и используя его из основного файла плагина:

 # myplugin/main-plugin-file.php namespace MyPlugin; function initialize() { try { $foo = new Foo(); $foo->doSomething(); } catch(SomethingWentWrongException $e) { // on debug is better to notice when bad things happen if (defined('WP_DEBUG') && WP_DEBUG) { throw $e; } // on production just fire an action, making exception accessible eg for logging do_action('my_plugin_error_shit_happened', $e); } } add_action('wp_loaded', 'MyPlugin\\initialize'); 

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

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

Это приблизительный пример такого объекта:

 namespace MyPlugin; class Options { private $options = []; private $ok = false; public function __construct($key) { $options = is_string($key) ? get_option($key) : false; if (is_array($options) && $options) { $this->options = $options; $this->ok = true; } } public function isOk() { return $this->ok; } } 

Теперь, из любого места в вашем плагине, вы можете сделать:

 /** * @return MyPlugin\Options */ function my_plugin_get_options() { return new MyPlugin\Options('my_plugin_options'); } $options = my_plugin_get_options(); if ($options->isOk()) { // do stuff } 

Обратите внимание, что my_plugin_get_options() выше всегда возвращает экземпляр класса Options , таким образом вы всегда можете передавать возвращаемое значение и даже вводить его другим объектам, использующим подсказку типа, теперь беспокоится о том, что тип отличается.

Если функция вернула null / false в случае ошибки, перед ее передачей вам пришлось проверить, действительно ли верное значение.

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

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