PHP: поймать исключение и продолжить выполнение, это возможно? - PullRequest
60 голосов
/ 25 января 2010

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

Ответы [ 7 ]

118 голосов
/ 25 января 2010

Да, но это зависит от того, что вы хотите выполнить:

* 1003 Е.Г. *

try {
   a();
   b();
}
catch(Exception $e){
}

c();

c() всегда будет выполняться. Но если a() выдает исключение, b() будет не выполненным.

Только помещайте материал в блок try, который зависит друг от друга. Например. b зависит от некоторого результата a, нет смысла ставить b после блока try-catch.

83 голосов
/ 25 января 2010

Конечно, просто поймайте исключение, где вы хотите продолжить выполнение ...

  try
  {
      SomeOperation();
  }
  catch (SomeException $e)
  {
      // do nothing... php will ignore and continue    
  }

Конечно, проблема в том, чтобы молча отбрасывать, что может быть очень важной ошибкой. SomeOperation () может не работать, вызывая другие тонкие, трудные для понимания проблемы, но вы никогда не узнаете, если отбросите исключение молча

15 голосов
/ 25 января 2010

Sure:

try {
   throw new Exception('Something bad');
} catch (Exception $e) {
    // Do nothing
}

Возможно, вы захотите прочитать документацию PHP по Исключения .

6 голосов
/ 25 января 2010

Да.

try {
    Somecode();
catch (Exception $e) {
    // handle or ignore exception here. 
}

однако обратите внимание, что php также имеет коды ошибок, отличные от исключений, что является наследием, оставшимся до того, как php имел oop примитивы. Большинство встроенных библиотек по-прежнему генерируют коды ошибок, а не исключения. Чтобы игнорировать код ошибки, вызовите функцию с префиксом @:

@myfunction();
1 голос
/ 19 августа 2018

php> 7

используйте новый интерфейс Throwable

    try {
        // Code that may throw an Exception or Error.
    } catch (Throwable $t) {
        // Handle exception
    }

echo "Script is still running..."; // this script will be executed.
0 голосов
/ 28 июля 2017

Старый вопрос, но тот, который у меня был в прошлом при переходе от VBA, распространяется на php, где вы можете использовать «GoTo» для повторного входа в цикл «При ошибке» с «Возобновить», и он ушел все еще обработка функции.
В 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();
    }
} 

Теперь я могу просмотреть свой массив результатов для каждого ключа и оценить результаты. Если есть критический сбой для a () или b ().
У меня все еще есть справка о том, как далеко он продвинулся до того, как произошел критический сбой в $ resultArr, и если обработчик исключений установлен правильно, я знаю, был ли это a () или b (), который потерпел неудачу.
Если c () не работает, цикл продолжает работать. Если c () не удался в различных точках, с небольшой дополнительной логикой пост-цикла, я даже могу узнать, сработал ли c () или имел ошибку на каждой итерации, опросив $ resultArr [$ key] [2].

0 голосов
/ 12 августа 2013

Другим аспектом этого является возвращение исключения, НЕ выбрасывая его, из кода обработки.

Мне нужно было сделать это с помощью шаблонной структуры, которую я пишу. Если пользователь пытается получить доступ к свойству, которое не существует в данных, я возвращаю ошибку из глубины функции обработки, а не выбрасываю ее.

Затем в вызывающем коде я могу решить, выдать ли эту возвращенную ошибку, вызывающую 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 (), но в любом случае вы можете повторно генерировать ошибки, и если вы полностью контролируете все структура, я думаю, это аккуратный способ обойти проблему неспособности продолжать попытки / ловит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...