Предупреждение Divide by Zero не попадает в блок try / catch PHP - PullRequest
0 голосов
/ 18 мая 2011

У меня есть этот код PHP. Всякий раз, когда y становится равным нулю, вместо перехвата исключения отображается предупреждение. Что-то не так с моим кодом?

try
{
    return($x % $y); 
    throw new Exception("Divide error..");
}
catch(Exception $e){
    echo "Exception:".$e->getMessage();
}

Я получил это предупреждение:

Warning: Division by zero in file.php

Блок захвата не запускается. Что я делаю не так?

Ответы [ 3 ]

7 голосов
/ 18 мая 2011

Предупреждение не является исключением. Предупреждения не могут быть получены с помощью методов обработки исключений. Ваше собственное исключение никогда не выдается, поскольку вы всегда return раньше.

Вы можете подавить предупреждения с помощью оператора @, например @($x % $y), но на самом деле вам нужно убедиться, что $y не становится 0.

т.е:.

if (!$y) {
    return 0; // or null, or do something else
} else {
    return $x % $y;
}
3 голосов
/ 18 мая 2011

Да, вы выполняете return перед throw.Следовательно, throw никогда не выполняется, и ни одно исключение не генерируется и не перехватывается.

0 голосов
/ 18 мая 2011

как это должно быть сделано

$value;

try
{
    $value = $x%$y; 
}
catch(Exception $e){
  throw new Exception("Divide error..");
  echo "Exception:".$e->getMessage();
}

return $value

Но так как вы получаете предупреждение, если хотите скрыть ошибку и обработать ее дискретно, вы можете использовать знак @

$value = @$x%$y;

теперь вы можете проверить значение и посмотреть, имеет ли оно значение, которое оно имеет

...