PHP try catch: получить переменную, определенную в try

Я пытаюсь отладить некоторый код. Я хочу показать переменные, определенные в try в catch. Например, переменная $siteId.

<?php
try {
    $siteId = 3;
    if(1 !== 2) {
        throw new Exception('1 does not equal 2!');
    }
} catch(Exception $e) {
    $moreInfo = '';
    if(isset($siteId)) {
        $moreInfo .= ' SiteId»' . $siteId;
    }
    echo 'Error' . $moreInfo . ':' . $e->getMessage();
}
?>

Ответ, который я получаю, составляет Error: 1 does not equal 2! вместо Error SiteId»3: 1 does not equal 2!. Что я делаю неправильно?

Ответ 1

Объявить $siteId вне конструкции try/catch и использовать !empty($siteId) внутри catch.

$siteId = null;
try {

}catch(Exceptions $e) {
  if( ! empty($siteId) ) {

  }
}

Ответ 2

Переменные в PHP привязаны к файлу, методу или функции (см. http://php.net/manual/en/language.variables.scope.php), поэтому я не уверен, как это не работает для вас. Быстрая cut-n-paste в PhpStorm выводит правильный ответ для меня.

Ответ 3

Попробуйте добавить \ в класс Exception. Итак, ваш код становится:

<?php
try {
    $siteId = 3;
    if(1 !== 2) {
        throw new \Exception('1 does not equal 2!');
    }
} catch(\Exception $e) {
    $moreInfo = '';
    if(isset($siteId)) {
        $moreInfo .= ' SiteId»' . $siteId;
    }
    echo 'Error' . $moreInfo . ':' . $e->getMessage();
}
?>

Ответ 4

попытайтесь вывести $siteId из try/catch:

<?php
$siteId = 3;
try {        
    if(1 !== 2) {
        throw new Exception('1 does not equal 2!');
    }
} catch(Exception $e) {
    $moreInfo = '';
    if(isset($siteId)) {
        $moreInfo .= ' SiteId»' . $siteId;
    }
    echo 'Error' . $moreInfo . ':' . $e->getMessage();
}
?>

Ответ 5

Я использую PHP 7.2, в моем случае переменная, определенная внутри блока Try, не доступна внутри catch, поэтому здесь есть обходной путь:

protected $var;

try  {

 $var = 'Hello World';

 // Saving var in an external variable so it can be accessed by Catch
 $this->var = $var;

 throw new Exception("Error Processing Request", 1);

} catch (Exception $e) {

   var_dump($var); // null
   var_dump($this->var); // 'Hello World'

}

Ответ 6

Я столкнулся с той же проблемой в php7 и как-то эта работа для меня

class dbConfig {
    private $servername ; private $username; private $password; private $conn;

     public function __construct()
    {
        $this->connect();
    }
    public function connect()
    {
        $servername = 'localhost';
        $username = 'root';
        $password= '';
        $dbName = 'dbname';
        try {
            $conn = new PDO("mysql:host=$servername;dbname=$dbName", $username, $password);
            // set the PDO error mode to exception
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            echo "Connected successfully"; 
            }
        catch(PDOException $e)
            {
            echo "Connection failed: " . $e->getMessage();
            }
    }