Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

06 Tratamento de Erros 02 Verificando Retorno

Ola povo! Seguinte: Quando o professor usa o bloco try catch, ele tenta dar catch num tipo de erro RunTimeException, e assim ele obtem a mensagem que ele definiu la no metodo insert da classe PdoStudentRepository.

Aqui, quando eu faco o mesmo, eu nao obtenho a mensagem definida no metodo insert. Depois de pesquisar um pouco, notei que o $stmt = $this->connection->prepare($insertQuery); ao inves de retornar false, ja retorna uma PDOException, e apesar do comando echo $e->getMessage() . PHP_EOL; do catch capturar um erro, ele nao captura o meu erro. Ele captura o PDOException, imprimindo a mensagem:

SQLSTATE[HY000]: General error: 1 no such table: studenta

Pq isso acontece? Pq o catch define que esta tentando pegar um RunTimeException, mas pega o outro erro? E pq mesmo assim, o $e->getMessage(); funciona, porem exibindo outra mensagem?

4 respostas

Olá, Xadai. Não entendi muito bem sua dúvida, mas o catch (\RuntimeException) pega uma PDOException porque ela estende RuntimeException.

https://www.php.net/pdoexception

Pronto, isso ja esclarece um bocado. Mas vamos la:

PdoStudentRepository.php
<?php

/* codigo omitido */

class PdoStudentRepository implements StudentRepository {

    /* codigo omitido */    

    private function insert(Student $student): bool {
            $insertQuery = "INSERT INTO studenta (name, birth_date) VALUES (:name, :birth_date);";
            $stmt = $this->connection->prepare($insertQuery);
            if($stmt === false){
                throw new \RunTimeException("Query error during insert");
            }
            $success = $stmt->execute([":name" => $student->name(), 
                                       ":birth_date" => $student->birthDate()->format("Y-m-d")]);
            if($success){
                $student->defineId($this->connection->lastInsertId());
            }
            return $success;
        }

    /* codigo omitido */

}
criar-turma.php
<?php

/* codigo omitido */

try {
    $connection->beginTransaction();
    $student1 = new Student(null, "Sicrana da Silva", new DateTimeImmutable("1990-02-02"));
    $student2 = new Student(null, "Beltrano de Sousa", new DateTimeImmutable("1985-03-03"));
    $studentRepository->saveStudent($student1);
    $studentRepository->saveStudent($student2);
    $connection->commit();
} catch (\RunTimeException $e){
    echo $e->getMessage() . PHP_EOL;
    $connection->rollBack();
}

Pq quando eu rodo o arquivo criar-turma.php, eu recebo SQLSTATE[HY000]: General error: 1 no such table: studenta, e o professor quando roda o mesmo arquivo recebe Erro na query do banco ?

solução!

Aahh, sim. Você está usando a versão 8 do PHP? Se sim, é por isso. Na versão 8 do PHP a configuração de lançar exceções vem ativada por padrão. No próximo vídeo desse treinamento nós habilitamos essa configuração. :-)

Nesse vídeo eu falo sobre isso também: https://www.youtube.com/watch?v=cjiG7wB5C9Y

massa Vinicius! valeu cara