2015-11-10 3 views
2

Я только что обновил с 4.2 до 5.0. Я получил все мои команды, но я заметил, что в одном скрипте я вижу ошибку (ожидаемую ошибку), которая сообщает об ошибке ErrorException. Проблема в том, что он прерывает мой сценарий, продолжая вместо перехода на следующий шаг в цикле foreach. Такая же ошибка с тем же скриптом в 4.2 сообщит об ошибке и продолжит работу.Консольные команды с ErrorException выходят из моего сценария вместо продолжения после ошибки

4,2: Cannot connect to xyz.IP Error 60. Operation timed out

5,0: [ErrorException] Cannot connect to xyz.IP Error 60. Operation timed out

Для больше контекста: Я использую скрипт для SSH в несколько серверов и выполнить команду Ping. Я использую Phpseclib 1.0. Я протестировал phpseclib на моей старой сборке 4.2, и она отлично работает. 5.0, где возникла проблема.

Кто-нибудь знает, как я могу заставить скрипт продолжать работать после исключения ErrorException?

foreach ($query as $key => $value) { 

    $ssh = new Net_SSH2($value->origin_ip); 
    $key = new Crypt_RSA(); 
    $key->loadKey(decryptIt($value->password)); 

    if (!$ssh->login($value->username, $key)) { 
     exit('Login Failed'); 
    } 

    $this->info(' Running Ping'); 

    //$ssh->setTimeout(1); 
    if ($ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX)) { 
     //echo "reading"; 
     //$this->info(' Running Ping'); 

     //$ssh->setTimeout(4); 

     $statusOutput=$ssh->exec("ping -c 1 -W 1 ".$value->destination_ip." >/dev/null 2>&1; echo $? "); 

    } else { 
     //echo "not reading"; 
     $this->error("Unable to Read Ping"); 
    } 
} 

ответ

1

Для работы с исключениями встроенного в сценарии, используйте try...catch блок:

try { 
    $value = someFunctionThatMayCauseAnException(); 
} catch (Exception $e) { 
    $errorMessage = $e->getMessage(); 
} 

Для получения дополнительной информации см ручного ввода PHP для Exceptions

«неперехваченного» исключения приведет к остановке скрипт. Иногда это желаемый эффект. Например, используемая вами библиотека SSH не учитывает исключения, которые происходят в методах, им разрешено пузыриться в вызывающем скрипте. Может быть, ваш вызывающий скрипт улавливает их, или, может быть, вы позволяете им перебирать свой глобальный обработчик исключений. Существует несколько способов работы с исключениями, но общее правило заключается в том, что вы не поймаете их, если вы не собираетесь что-то с ним делать, например, показывать сообщение об ошибке.

Ваш сценарий будет продолжен в предыдущей версии, потому что ошибка, скорее всего, была выбрана как предупреждение или уведомление и возвращает false для указания отказа. С новой версией PHP библиотека вместо этого начала испускать исключения, сразу указывая на отказ и предоставляя объект исключения с подробностями о сбое.

Это означает, что вам придется реструктурировать логику в вашем цикле вместо прямого вызова функции в условном if. Вы не указали, какая линия испуская исключение в вашем примере, но, например, это один из способов, которые вы могли бы реструктурировать работать с исключениями:

$errorMessage = false; 
try { 
    $ssh->login($value->username, $key); // this code is attempted 
} catch (Exception $e) { 
    // if an exception is emitted 
    // in the try block above, this block 
    // is reached. Otherwise, it is skipped 
    $errorMessage = $e->getMessage(); 
} 

// $errorMessage can only be other than false from the exception catch block above 
if ($errorMessage !== false) { 
    exit($errorMessage); 
} 
+0

я решил. У моего исходного кода был блок try/catch, но я опустил его здесь. Проблема была действительно глупой. Мой try catch использовал 'catch (Exception $ e)', но мне нужно было 'catch (\ Exception $ e)'. Обратите внимание на косую черту. Видел это в другом потоке, пробовал, и это сработало. Ошибка все еще существует, но сценарий продолжается, и это то, что мне нужно. – Envious

+0

Косая черта - это пространство имен, в данном случае - корневое или глобальное, и да, вам нужно будет использовать правильное имя для имени класса Exception, если вы находитесь в другом пространстве имен и не импортируете корневой класс исключения. Что касается уже попытки ...catch, это было странно, чтобы опустить из вашего примера кода, и ваш оператор проблемы совсем не упоминает об этом - действительно, оператор проблемы указывает на то, что не поймал исключение, поэтому я разместил этот ответ. Вы потратили впустую свое время и ошиблись в своей проблеме:/ –

0

решаемые его. У меня была попытка улова, которую я модифицировал.

Убедитесь, что catch имеет обратную черту, как это:

try { 
    //code here 
} catch (\Exception $e) { 
    print_r($e->getMessage()); 
} 
+0

Это не всегда так, только если вы не находитесь в корневом пространстве имен и в зависимости от операторов использования. –