Обработка исключений PHP против C # - PullRequest
3 голосов
/ 26 октября 2010

это действительно основной вопрос (я надеюсь). Большая часть обработки исключений, которую я сделал, была с c #. В c # любой код с ошибками в блоке try catch обрабатывается кодом catch. Например

try
{
 int divByZero=45/0;
}
catch(Exception ex)
{
 errorCode.text=ex.message();
}

Ошибка будет отображаться в errorCode.text. Если бы я попытался запустить тот же код в php, однако:

try{
    $divByZero=45/0;
    }
catch(Exception ex)
{
  echo ex->getMessage();
}

Код перехвата не выполняется. Исходя из моего глубокого понимания, PHP нужно бросить. Разве это не противоречит всей цели проверки ошибок? Разве это не уменьшает улов try до оператора if then? if (деление на ноль) сгенерировать ошибку Пожалуйста, скажите мне, что я не должен предвидеть каждую возможную ошибку в попытке поймать с броском. Если я это сделаю, есть ли способ заставить обработчик ошибок php вести себя как c #?

Ответы [ 4 ]

6 голосов
/ 26 октября 2010

Вы также можете преобразовать все ваши ошибки php с помощью set_error_handler () и ErrorException в исключения:

function exception_error_handler($errno, $errstr, $errfile, $errline )
{
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

try {
    $a = 1 / 0;
} catch (ErrorException $e) {
    echo $e->getMessage();
}
2 голосов
/ 26 октября 2010

С http://php.net/manual/en/language.exceptions.php

"Внутренние функции PHP в основном используют отчеты об ошибках, только современные объектно-ориентированные расширения используют исключения. Однако ошибки можно просто преобразовать в исключения с помощью ErrorException."

См.также http://www.php.net/manual/en/class.errorexception.php

2 голосов
/ 26 октября 2010

PHP try-catch был реализован позже в жизни языка, и поэтому он применяется только к пользовательским исключениям.

Если вы действительно хотите обрабатывать ошибки , , установите свой собственный обработчик ошибок .

Для определения и отлова исключений :

function oops($a)
{
    if (!$a) {
        throw new Exception('empty variable');
    }
    return "oops, $a";
}

try {
    print oops($b);
} catch (Exception $e) {
    print "Error occurred: " . $e->getMessage();
}
1 голос
/ 26 октября 2010

Я думаю, что единственный способ справиться с этим в PHP - написать:

try
{ 
  if ($b == 0) throw new Exception('Division by zero.');
  $divByZero = $a / $b; 
} 
catch(Exception ex) 
{ 
  echo ex->getMessage(); 
} 

В отличие от C #, не каждая проблема вызовет исключение в PHP.Некоторые проблемы молча игнорируются (или не молча - они выводят что-то на вывод), но есть и другие способы их обработки.Я полагаю, это потому, что исключения не были частью языка со времени первой версии, поэтому существуют некоторые «устаревшие» механизмы.

...