Можно ли исключить исключение и продолжить выполнение script?
Php: исключение catch и продолжить выполнение, возможно ли это?
Ответ 1
Конечно, просто поймайте исключение, где вы хотите продолжить выполнение...
try
{
SomeOperation();
}
catch (SomeException $e)
{
// do nothing... php will ignore and continue
}
Конечно, проблема состоит в том, чтобы тихо отбросить то, что может быть очень важной ошибкой. SomeOperation() может терпеть неудачу, вызывая другие тонкие, трудные проблемы с определением, но вы никогда не узнаете, если вы отключите исключение.
Ответ 2
Да, но это зависит от того, что вы хотите выполнить:
например.
try {
a();
b();
}
catch(Exception $e){
}
c();
c()
всегда будет выполняться. Но если a()
выдает исключение, b()
выполняется не.
Поместите материал в блок try
, который зависит друг от друга. Например. b
зависит от некоторого результата a
, нет смысла ставить b
после блока try-catch
.
Ответ 3
Конечно:
try {
throw new Exception('Something bad');
} catch (Exception $e) {
// Do nothing
}
Вам может потребоваться прочитать документацию PHP на Exceptions.
Ответ 4
Да.
try {
Somecode();
catch (Exception $e) {
// handle or ignore exception here.
}
однако обратите внимание, что php также имеет коды ошибок, отдельно от исключений, унаследованное удержание до того, как php имел примитивные примитивы. Большинство встроенных библиотек по-прежнему вызывают коды ошибок, а не исключения. Чтобы игнорировать код ошибки, вызовите функцию с префиксом @:
@myfunction();
Ответ 5
Другой угол на этом возвращает Исключение, НЕ выбрасывающее его, из кода обработки.
Мне нужно было сделать это с помощью шаблона, который я пишу. Если пользователь пытается получить доступ к свойству, которое не существует в данных, я возвращаю ошибку из глубины функции обработки, а не бросаю ее.
Затем, в вызывающем коде, я могу решить, нужно ли это вернуть возвращенную ошибку, заставив 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(), но так как вы можете повторно перебрасывать ошибки в любом случае, и если вы полностью контролируете общий структуры, я думаю, что это аккуратный путь вокруг проблемы неспособности продолжить попытки/уловы.
Ответ 6
Старый вопрос, но тот, который я имел в прошлом, когда отходил от 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() не удался в разных точках, с небольшим количеством дополнительной логики цикла сообщений, я даже могу узнать, работала ли c() или имела ошибку на каждой итерации путем опроса $resultArr [$ key] [2].