Можно ли поймать исключение и продолжить выполнение скрипта?
Конечно, просто поймайте исключение, где вы хотите продолжить выполнение …
try { SomeOperation(); } catch (SomeException $e) { // do nothing... php will ignore and continue }
Конечно, проблема состоит в том, чтобы тихо отбросить то, что может быть очень важной ошибкой. SomeOperation () может не сработать с другими трудными задачами, но вы никогда не узнаете, не прекратите ли вы исключение.
Да, но это зависит от того, что вы хотите выполнить:
Например
try { a(); b(); } catch(Exception $e){ } c();
c()
всегда будет выполняться. Но если a()
выдает исключение, b()
не выполняется.
Поместите материал в блок try
который зависит друг от друга. Например, b
зависит от некоторого результата a
нет смысла ставить b
после блока try-catch
.
Конечно:
try { throw new Exception('Something bad'); } catch (Exception $e) { // Do nothing }
Возможно, вы захотите ознакомиться с документацией PHP по исключениям .
Да.
try { Somecode(); catch (Exception $e) { // handle or ignore exception here. }
однако обратите внимание, что php также имеет коды ошибок отдельно от исключений, унаследованное удержание до того, как php имел примитивные примитивы. Большинство встроенных библиотек по-прежнему вызывают коды ошибок, а не исключения. Чтобы игнорировать вызов кода ошибки, функция, префиксная с помощью @:
@myfunction();
Другой угол на этом возвращает Исключение, не выбрасывая его, из кода обработки.
Мне нужно было сделать это с помощью шаблонов, которые я пишу. Если пользователь пытается получить доступ к свойству, которое не существует в данных, я возвращаю ошибку из глубины функции обработки, а не бросаю ее.
Затем, в вызывающем коде, я могу решить, нужно ли это возвращать, заставляя try () catch () или просто продолжать:
// process the template try { // this function will pass back a value, or a TemplateExecption if invalid $result = $this->process($value); // if the result is an error, choose what to do with it if($result instanceof TemplateExecption) { if(DEBUGGING == TRUE) { throw($result); // throw the original error } else { $result = NULL; // ignore the error } } } // catch TemplateExceptions catch(TemplateException $e) { // handle template exceptions } // catch normal PHP Exceptions catch(Exception $e) { // handle normal exceptions } // if we get here, $result was valid, or ignored return $result;
В результате я все еще получаю контекст исходной ошибки, даже если она была выбрана вверху.
Другой вариант может состоять в том, чтобы вернуть пользовательский объект NullObject или UnknownProperty и сравнить его с тем, прежде чем принимать решение об отладке catch (), но так как вы можете повторно перебрасывать ошибки в любом случае, и если вы полностью контролируете общую структуру, я подумайте, что это непростой путь вокруг проблемы неспособности продолжить попытки / уловы.
Старый вопрос, но тот, который у меня был в прошлом, когда я отходил от VBA-скриптов к php, где вы могли бы нам «GoTo» повторно ввести цикл «On Error» с «Resume», и он продолжал обрабатывать функцию ,
В php, после нескольких проб и ошибок, теперь я использую вложенный try {} catch {} для критических или некритических процессов или даже для взаимозависимых вызовов класса, чтобы я мог проследить путь до начала ошибки. например, если функция b зависит от функции a, но функция c хороша, но не должна останавливать процесс, и я все же хочу знать результаты всех 3 независимо от того, что я делаю:
//set up array to capture output of all 3 functions $resultArr = array(array(), array(), array()); // Loop through the primary array and run the functions foreach($x as $key => $val) { try { $resultArr[$key][0][] = a($key); $resultArr[$key][1][] = b($val); try { // If successful, output of c() is captured $resultArr[$key][2][] = c($key, $val); } catch(Exception $ex) { // If an error, capture why c() failed $resultArr[$key][2][] = $ex->getMessage(); } } catch(Exception $ex) { // If critical functions a() or b() fail, we catch the reason why $criticalError = $ex->getMessage(); } }
Теперь я могу пройти через массив результатов для каждого ключа и оценить результаты. Если есть критический отказ для () или b ().
У меня все еще есть точка отсчета о том, как далеко она была до того, как критический сбой произошел в $ resultArr, и если обработчик исключений установлен правильно, я знаю, что это было () или b (), которые не удались.
Если c () терпит неудачу, цикл продолжается. Если c () не удался в разных точках, с небольшим количеством дополнительной логики цикла post, я даже могу узнать, работала ли c () или имела ошибку на каждой итерации путем опроса $ resultArr [$ key] [2].