Викидання винятків у блоці PHP Try Catch


76

У мене є функція PHP у файлі .module Drupal 6. Я намагаюся запустити перевірку початкових змінних перед виконанням більш інтенсивних завдань (таких як запити до бази даних). У 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.

Спасибі заздалегідь!


3
tl; dr "throw $ e-> getMessage ();" має бути "кинь $ e;"
Крістофф Еразм

Такий самий пароль , здається продукції: Parse error: syntax error, unexpected 'throw' (T_THROW). Думаю, більше не підтримується.
user2924019

Відповіді:


105
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;
    */
  }
}

1
Так, обидві ваші пропозиції в блоці Catch вирішать мою проблему. Дякую!
kaspnord

67

Перекинути робити

 throw $e;

не повідомлення.


Дякую, це рішення найбільш підходить для моїх потреб.
kaspnord

Це я і думав, радий допомогти.
Chen Kinnrot

6
Чи збереже це інформацію про стек, чи перезапише?
DanMan

4
утримувати, щоб замінити кидок нового е
Чен Кінрот

16

Просто видаліть throwіз блоку catch - змініть його на echoабо обробіть помилку іншим чином.

Це не говорить вам, що об’єкти можна кидати лише в блок catch, це говорить вам, що тільки об’єкти можна кидати , і місце помилки знаходиться в блоці catch - є різниця.

У блоці catch ви намагаєтеся кинути те, що щойно зловили, - що в цьому контексті мало сенсу, - і те, що ви намагаєтеся кинути, - це рядок.

Реальна аналогія того, що ви робите - це ловити м’яч, а потім намагатися кинути просто логотип виробника кудись ще. Ви можете кинути лише цілий предмет, а не властивість об’єкта.


Дякую за роз'яснення.
kaspnord

Хороша аналогія (у).
Тоні Влчек

7
throw $e->getMessage();

Ви намагаєтесь кинути a string

Як допоміжна точка: Винятки зазвичай полягають у визначенні виняткових станів програми, а не для повідомлень про помилки після перевірки. Це не виняток, коли користувач надає вам недійсні дані


Що було б кращим способом обробки перевірок? Чи будуть оператори IF більш доречними при обробці недійсних даних користувачів?
kaspnord

Коротше: Так. Коротко: розгляньте випадки недійсних аргументів, як будь-яку іншу ситуацію, що може статися у вашому додатку, і покажіть іншу корисну (з помилками) сторінку. function validateField($validate) {return empty($validate);}а десь наприкладif validateField($x){ echo "Field is empty";}else{doSomethingUseful();}
KingCrunch

4
@lazycommit "недійсні дані" трохи загальне. Якщо ви маєте на увазі "недійсні значення, надані користувачем", то вони не є недійсними з точки зору додатків, оскільки програма повинна цього очікувати і, отже, повинна обробляти їх належним чином (-> перевірка). Якщо ви передасте недійсні дані пізніше під час обробки (із серверної бази або через неправильну перевірку), тоді так: Виняток. Підводячи підсумок: Не використовуйте Exceptions для керування потоком (тут: перевірка) :)
KingCrunch

Ви можете лише throwоб'єкти, так throw $e;або throw new \Exception( $e->getMessage() );.
Самуель Ель

0

Throw потребує об'єкта, створеного за допомогою \Exception. Просто $eспійманий може зіграти фокус.

throw $e
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.