Подтвердить что ты не робот

Php: исключение catch и продолжить выполнение, возможно ли это?

Можно ли исключить исключение и продолжить выполнение script?

4b9b3361

Ответ 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].