Questo perché se
$db = new SQLite3($dbname,SQLITE3_OPEN_READONLY); // Crea il database
fallisce, in $db non c'è l'oggetto SQLIte dato che appunto la creazione ha fallito.
echo $db->lastErrorCode();
lo puoi usare sugli errori generati in seguito, per esempio dopo aver effettuato una query per vedere se restituisce un errore, ma non sulla creazione dell'oggetto stesso.