Создание исключений в блоке PHP Try Catch - PullRequest
65 голосов
/ 28 января 2012

У меня есть функция PHP в файле Drupal 6 .module.Я пытаюсь запустить первоначальную проверку переменных до выполнения более интенсивных задач (таких как запросы к базе данных).В C # я использовал для реализации операторов IF в начале моего блока Try, который генерировал новые исключения, если проверка не удалась.Брошенное исключение будет поймано в блоке Catch.Вот мой PHP-код:

function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    throw $e->getMessage();
  }
}

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

Заранее спасибо!

Ответы [ 5 ]

98 голосов
/ 28 января 2012
function _modulename_getData($field, $table) {
  try {
    if (empty($field)) {
      throw new Exception("The field is undefined."); 
    }
    // rest of code here...
  }
  catch (Exception $e) {
    /*
        Here you can either echo the exception message like: 
        echo $e->getMessage(); 

        Or you can throw the Exception Object $e like:
        throw $e;
    */
  }
}
61 голосов
/ 28 января 2012

Для повторного выброса

 throw $e;

не сообщение.

15 голосов
/ 28 января 2012

Просто удалите throw из блока catch - измените его на echo или иным образом обработайте ошибку.

Это не говорит о том, что объекты могут быть выброшены только в блоке захвата, это говорит о том, что только объекты могут быть выброшены, и место ошибки находится в блоке захвата - есть разница .

В блоке catch вы пытаетесь выбросить что-то, что вы только что поймали - что в этом контексте в любом случае не имеет особого смысла - и то, что вы пытаетесь выбросить, - это строка.

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

4 голосов
/ 28 января 2012
throw $e->getMessage();

Вы пытаетесь бросить string

Как примечание: Исключения обычно определяют исключительные состояния приложения, а не сообщения об ошибках после проверки. Это не исключение, когда пользователь дает вам недействительные данные

0 голосов
/ 29 июля 2018

Бросок нуждается в объекте, созданном \Exception.Только $e пойманный может сыграть свою роль.

throw $e
...