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

14

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));
смотрите также:eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/… dreftymac
смотрите также:verysimple.com/2010/11/02/… dreftymac

Ваш Ответ

4   ответа
13

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

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

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

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

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));
    }
2

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

11

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

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

Похожие вопросы