Блоки try-catch в PHP: способны ли они перехватывать недопустимые типы arg?

Background: Предположим, у меня есть следующий явно неправильный PHP:

    try{
        $vtest = '';
        print(array_pop($vtest));
    }catch(Exception $exx){}

Чтобы он работал с array_pop, $ vtest, очевидно, должен быть массивом, а не строкой. Тем не менее, когда я запускаю этот код, появляется предупреждение. Я не хочу этого, я просто хочу, чтобы код молча провалился.

Question: Есть ли что-то особенное в PHP try-catch по сравнению с другими языками, которые заставляют это не работать?

Disclaimer: Just for reference, it is true there are other ways to handle this situation in PHP, but these are undesirable. The goal here is to avoid:

The "at-sign" trick:

        $vtest = '';
        print(@array_pop($vtest)); // <-- would like to avoid this

Type Casting:

        $vtest = '';
        $vtest = (array)$vtest;  
        print(array_pop($vtest));
 dreftymac21 нояб. 2011 г., 14:52
смотрите также:verysimple.com/2010/11/02/…
 dreftymac15 мар. 2018 г., 21:43
 dreftymac03 апр. 2015 г., 01:12
 dreftymac16 февр. 2017 г., 22:10
 dreftymac14 авг. 2018 г., 02:02

Ответы на вопрос(4)

Решение Вопроса

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

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

 06 июл. 2009 г., 16:58
Вопрос был в том, «есть ли что-то особенное в PHP try-catch по сравнению с другими языками, из-за которых это не работает?» Я думаю, что это совершенно справедливый ответ на этот вопрос. И, к сведению, я люблю PHP, и это мой язык выбора для веб-разработки на стороне сервера.
 02 июн. 2011 г., 23:31
Stackoverflow - куда люди приходят критиковать вас через два года после того, как вы помогаете кому-то.
 06 июл. 2009 г., 17:07
Я не был с вами не согласен;) и теперь вижу направление, в котором идет ваш ответ. :)

которым я могу придумать, - это сделать следующее:

try{
    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }
    else{
        throw new NotArrayException()
    }
}catch(NotArrayException $exx){}

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

    $vtest = '';
    if(is_array($vtest)){
        print(array_pop($vtest));
    }

когда преобразуете каждую ошибку в исключение. Я настроил немногосреда обработки ошибок, Просто проверьте это - это будет работать.

который вы предоставили, но вы можете использоватьset_error_handler диктовать, как обрабатывается предупреждение; то есть вы можете вызвать исключение. Кроме того, вы можете использоватьrestore_error_handler чтобы вернуться к обработке ошибок по умолчанию, когда вы закончите.

function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');

Ваш ответ на вопрос