Bloco catch mostra como undefined a uma variável

Olá pessoal bom dia a todos. Estou com um problema na hora de mostrar o valor de uma variável dentro do bloco catch. Ele simplesmente não imprime na tela o valor da variável $sql, aqui o código:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "meudb";

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);
$sql = "INSERT INTO minhaTabela (firstname)
VALUES ('John')";
// use exec() because no results are returned
$conn->exec($sql);
$last_id = $conn->lastInsertId();
echo "New record created successfully. Last inserted ID is: " . $last_id;
} catch(PDOException $e) {
    echo $sql ."<br>".$e->getMessage();
}
$conn = null;

O erro ocorre exatamente no bloco catch quando tento imprimir na tela o valor da variável $sql, aqui nesta parte:

catch(PDOException $e){
echo $sql . "<br>". $e->getMessage();
}

Na tela aparece o seguinte:

  1. Quando tudo corre bem:
    New record created successfully. Last inserted ID is: 1

  2. Quando algo dá errado,

SQLSTATE[HY000] [1045] Access denied for user ‘root’@‘localhost’ (using password: YES)

Não aparece na tela o valor de $sql que seria a consulta a MySQL. E no IDE aparece que $sql é undefined

– O certo seria que apareça assim:

INSERT INTO minhaTabela (firstname) VALUES (‘John’)
SQLSTATE[HY000] [1045] Access denied for user ‘root’@‘localhost’ (using password: YES)

Qual seria o erro que estaria cometendo?