Intereting Posts
Размер загрузки PHP и его влияние на размер сообщения и ограничение памяти Мне нужен удобный для чтения, но формат документа, пригодный для анализа Доступ к основному изображению страницы wikipedia по API Пользовательский провайдер SonataMediaBundle Найти значение & ключ в многомерном массиве Как base64-декодировать большие файлы в PHP Прочтите длинное значение из webservice с помощью SoapClient Как отобразить список родительских категорий (со ссылками) в WordPress PHP, как установить часовой пояс? Как отсортировать значения NULL в последний раз, используя Eloquent в Laravel Является ли MVC единственным способом писать PHP? CodeIgniter: функция потерянного пароля, как реализовать? Как отправить запрос AJAX, когда пользователь уходит (закрывает) страницу? Метод select_botton для искателя Symfony не может получить форму Как получить данные массива $ _FILES, как и после отправки формы в следующем сценарии?

PHP: инструкция «или» при сбое инструкции: как выбросить новое исключение?

Все здесь должны знать «или» statemens, обычно приклеенные к команде die ():

$foo = bar() or die('Error: bar function return false.'); 

В большинстве случаев мы видим что-то вроде:

 mysql_query('SELECT ...') or die('Error in during the query'); 

Тем не менее, я не могу понять, как это работает.

Я хотел бы создать новое исключение вместо die (), но:

 try{ $foo = bar() or throw new Exception('We have a problem here'); 

Не работает, и ни

 $foo = bar() or function(){ throw new Exception('We have a problem here'); } 

Единственный способ, которым я нашел это, – это ужасная мысль:

 function ThrowMe($mess, $code){ throw new Exception($mess, $code); } try{ $foo = bar() or ThrowMe('We have a problem in here', 666); }catch(Exception $e){ echo $e->getMessage(); } 

Но есть способ выбросить новое исключение непосредственно после утверждения «или»?

Или этот тип структуры является обязательным (я вообще не выполняю функцию ThrowMe):

 try{ $foo = bar(); if(!$foo){ throw new Exception('We have a problem in here'); } }catch(Exception $e){ echo $e->getMessage(); } 

Изменить : я хочу, чтобы избежать использования if () для проверки каждой потенциально опасной операции, например:

 #The echo $e->getMessage(); is just an example, in real life this have no sense! try{ $foo = bar(); if(!$foo){ throw new Exception('Problems with bar()'); } $aa = bb($foo); if(!$aa){ throw new Exception('Problems with bb()'); } //...and so on! }catch(Exception $e){ echo $e->getMessage(); } #But i relly prefer to use something like: try{ $foo = bar() or throw new Exception('Problems with bar()'); $aa = bb($foo) or throw new Exception('Problems with bb()'); //...and so on! }catch(Exception $e){ echo $e->getMessage(); } #Actually, the only way i figured out is: try{ $foo = bar() or throw new ThrowMe('Problems with bar()', 1); $aa = bb($foo) or throw new ThrowMe('Problems with bb()', 2); //...and so on! }catch(Exception $e){ echo $e->getMessage(); } #But i'll love to thro the exception directly instead of trick it with ThrowMe function. 

Solutions Collecting From Web of "PHP: инструкция «или» при сбое инструкции: как выбросить новое исключение?"

or просто логический оператор , и он аналогичен || ,

Общий трюк

 mysql_query() or die(); 

может быть так же хорошо написано

 mysql_query() || die(); 

Здесь происходит «логический» или «оператор» (в зависимости от того, что вы выбираете) пытается определить, оценивает ли операнд TRUE. Это означает, что операнды должны быть выражениями, которые могут быть представлены как логические.

Итак, причина

 bar() or throw new Exception(); 

является незаконным, потому что

 (boolean)throw new Exception(); 

также является незаконным. По сути, процесс выброса исключения не генерирует возвращаемое значение для проверки оператором.

Но вызов функции действительно генерирует возвращаемое значение для оператора для проверки (никакое явное возвращаемое значение не приведет к тому, что функция возвращает NULL которая отличает FALSE ), поэтому она работает для вас, когда вы включаете исключение в функцию.

Надеюсь, это поможет.

Почему bar() и bb() исключают исключения? В PHP Исключения пузырь, поэтому нет необходимости бросать исключение в функцию / метод, где вы вызываете bar() / bb() . Эти исключения могут быть выбраны bar() / bb() . Если вы хотите сделать другое исключение, вы можете просто сделать:

 function foo() { try { $bar = bar(); } catch (BarException) { throw new FooException; } } 

Я думаю, вы хотите использовать что-то вроде последней структуры, хотя нет смысла использовать исключения для этого:

 $foo = bar(); if(!$foo){ echo 'We have a problem in here'; } 

За комментарий – я не думаю, что вы можете сделать это в одной строке (т. Е. Без проверки if(!$foo) ), и я согласен с тем, что метод метаданных исключений довольно ужасен. Лично я предпочитаю объяснение:

 $foo = bar(); if(!$foo){ throw new Exception('We have a problem in here'); } 

но это личное предпочтение. Если вам нужна однострочная вещь, я думаю, вам придется пойти с опцией функции исключения исключений.

Я предполагаю, что это ограничение, вероятно, связано с материалом динамической типизации PHP, он может отличать результаты вызова функции от условного, но не от результатов throw .

Вот однострочное решение без дополнительной функции:

 if (!($foo = bar())) throw new Exception('We have a problem here'); 

Вы также можете создать собственный класс исключений и использовать его метод статического конструктора вместо того, чтобы создавать throw new Exception() .

Класс исключений:

 class CustomException extends Exception { static public function doThrow($message = "", $code = 0, Exception $previous = null) { throw new Exception($message, $code, $previous); } } 

Применение:

 try { $foo = bar() or CustomException::doThrow('Problems with bar()'); $aa = bb($foo) or CustomException::doThrow('Problems with bb()'); } catch(Exception $e){ echo $e->getMessage(); } 

Заметка

Если вы используете PHP 7 и выше, вы можете переименовать статический метод doThrow() чтобы просто throw() , поскольку в PHP 7 и выше разрешено использовать зарезервированные ключевые слова в качестве имен методов.