Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso PHP Exceptions: tratamento de erros

PHP Exceptions: tratamento de erros

Pilha de execução - Introdução

Olá pessoal, boas vindas a Alura! Meu nome é Vinicius Dias e serei seu instrutor nesse treinamento sobre tratamento de erros e exceções utilizando o PHP. Antes de falarmos sobre o tema, conversaremos um pouco sobre o modelo de execução de um programa em PHP e na maioria das linguagens de programação: a pilha de execução.

Após entendermos como a pilha de execução funciona, entraremos propriamente no conteúdo sobre exceções: quais são os casos excepcionais que podem acontecer no nosso código, o que pode gerá-los e como eles podem ser tratados. Nesse ponto, aprenderemos a usar o try/catch para executarmos um código que, na ocorrência de um desses casos excepcionais, estará pronto para tratá-lo. Além disso, entenderemos o uso do finally, apesar de sua pouca utilização em PHP.

Também existem outras palavras usadas no tratamento de exceções, como a palavra throw, para quando queremos lançar exceções. Nesse curso aprenderemos a criar as nossas próprias exceções, inclusive personalizando-as com informações definidas por nós, e também trabalharemos com exceções fornecidas pelo próprio PHP.

Outro assunto que abordaremos são os erros que o PHP fornece.

Embora nesse diagrama a parte de exceções esteja vazia, também conversaremos sobre as SPL Exceptions, ou "exceções da biblioteca SPL", entendo as suas utilidades.

Prosseguindo, falaremos sobre um assunto não tão cômodo e interessante, muitas vezes negligenciado, mas também importante: os erros legados do PHP, ou seja, a forma como o PHP tratava os erros na maioria das condições antes do PHP 7.0. Entenderemos então o que é são notice, warning e fatal error (erro fatal), como reportar tais erros e fazer o seu log, além de como tratá-los. Como existem ferramentas específicas para isso, não entraremos em detalhes a respeito do gerenciamento de erros.

Embora bastante denso, esse é um conteúdo muito importante nos seus estudos de PHP. Portanto, se algo não ficar claro, não deixe de abrir um tópico no Fórum da Alura, onde nossos instrutores, moderadores e outros usuários da comunidade poderão ajudar!

Bons estudos!

Pilha de execução - Execução de um programa

Antes de começarmos a falar sobre erros e exceções, que é o assunto fundamental do curso, conversaremos um pouco mais sobre a execução de um programa em PHP. Para garantirmos que estamos no mesmo ambiente, saiba que o curso foi gravado usando o PHP 7.4, mas você pode utilizar qualquer versão posterior a essa.

Já tratamos sobre a instalação do PHP em cursos anteriores, portanto você pode acessá-los se tiver dúvidas em relação a esse processo. Além disso, usaremos o PhpStorm como IDE, mas você pode optar pelo seu editor de código ou IDE preferido. Nos arquivos baixados no exercício anterior, encontramos um arquivo chamado pilha.php, cuja motivação para escolha do nome ficará mais evidente no futuro.

<?php

function funcao1()
{
    echo 'Entrei na função 1' . PHP_EOL;
    funcao2();
    echo 'Saindo da função 1' . PHP_EOL;
}

function funcao2()
{
    echo 'Entrei na função 2' . PHP_EOL;
    for ($i = 1; $i <= 5; $i++) {
        echo $i . PHP_EOL;
    }
    echo 'Saindo da função 2' . PHP_EOL;
}

echo 'Iniciando o programa principal' . PHP_EOL;
funcao1();
echo 'Finalizando o programa principal' . PHP_EOL;

Sempre que um programa PHP é executado, ele parte da execução de um arquivo que possui duas principais formas de instrução: a declaração de símbolos (criação de funções, classes etc.) e a própria execução. Portanto, se tivermos um código fora da declaração de uma função ou classe, ele será executado quando executarmos o arquivo. Esses conceitos já foram abordados nos cursos anteriores.

Sendo assim, o nosso programa principal começará pelas seguintes instruções:

echo 'Iniciando o programa principal' . PHP_EOL;
funcao1();
echo 'Finalizando o programa principal' . PHP_EOL;

Temos aqui o início de uma função main(), ainda que ela não esteja explicitada no código, a exibição da mensagem "Iniciando o programa principal" e uma chamada de funcao1(). Note que estamos usando programação procedural, e não orientação a objetos, para simplificarmos esses processos. Na chamada da funcao1(), executaremos o seguinte trecho de código:

function funcao1()
{
    echo 'Entrei na função 1' . PHP_EOL;
    funcao2();
    echo 'Saindo da função 1' . PHP_EOL;
}

Aqui exibimos uma mensagem explicitando que estamos entrando na função e executamos a funcao2(), que corresponde a outro trecho de código:

function funcao2()
{
    echo 'Entrei na função 2' . PHP_EOL;
    for ($i = 1; $i <= 5; $i++) {
        echo $i . PHP_EOL;
    }
    echo 'Saindo da função 2' . PHP_EOL;
}

Exibimos uma nova mensagem, dessa vez relacionada a entrada na nova função, executamos uma lógica qualquer - nesse caso, exibindo os valores de 1 a 5 - e depois exibimos outra mensagem informando a saída dessa função. Finalizada essa execução, retornamos para funcao1(), responsável por chamá-la, e exibimos outra mensagem que informa a saída desta função.

Voltamos então ao nosso código principal e exibimos a mensagem "Finalizando o programa principal". Ao executarmos, teremos como retorno:

Iniciando o programa principal
Entrei na função 1
Entrei na função 2
1
2
3
4
5
Saindo da função 2
Saindo da função 1
Finalizando o programa principal

Se você não estiver usando o PhpStorm, pode usar o Prompt de Comando ou o Terminal do Windows. Tendo o PHP instalado, bastará acessar o diretório do arquivo a ser executado e usar o comando php pilha.php, por exemplo - ou seja, php nomeDoArquivo.php.

Isso já foi visto nos cursos anteriores e pode até mesmo parecer óbvio, mas é importante entendermos a linha de execução de um programa para encontrarmos possíveis problemas quando eles acontecerem. A ideia aqui é percebermos que o PHP funciona, de certa forma, de cima para baixo - ou seja, começamos na primeira instrução e passamos para as próximas.

Também temos as declarações de funções, que não necessariamente precisam estar em ordem, mas as suas chamadas serão executadas em ordem de acordo com a linha em que isso ocorreu. Conforme nosso projeto vai crescendo, também vamos adicionando cada vez mais instruções para serem executadas.

No próximo vídeo usaremos alguns recursos visuais para entendermos em detalhes como ocorre esse processo, além do motivo de termos chamado esse arquivo de pilha.php.

Pilha de execução - Entendendo a pilha

Agora tentaremos mostrar de maneira um pouco mais visual o que acontece em um programa PHP, além de explicarmos o motivo de começarmos o treinamento de forma tão básica.

funcao0

Imagine que temos um espaço de memória utilizado pelo PHP para armazenar as variáveis e funções sendo executadas em determinado momento. Quando a primeira linha de um programa é executada, ele reserva um espaço de memória para o que chamamos de main. Em seguida, segundo o nosso código, ele exibe uma mensagem no console e passa para a próxima linha, na qual chamamos funcao1().

funcao1

Ao encontrar essa função, o PHP irá executá-la e reservará um espaço na memória para ela. Continuando, chamaremos a funcao2(), que, ao ser encontrada, também será executada e terá um espaço reservado na memória.

funcao2

Até o momento já exibimos a mensagem "Iniciando o programa principal", chamamos a primeira função, fazendo com que a mensagem "Entrei na função 1" seja exibida, e chamamos também a segunda função, exibindo "Entrei na função 2". Os espaços reservados pelo PHP guardam as as instruções que serão executadas e as variáveis de cada uma das funções - ou seja, as variáveis locais, que só existem dentro das funções.

funcao3

Isso significa que não conseguiremos exibir essa variável na funcao1(), já que ela só existe no escopo da funcao2(). Quando o PHP termina a execução dessa função,ele joga fora o espaço de memória reservado a ela volta a execução da funcao1(). Isso é semelhante a uma pilha de pratos que podem ser colocados uns sobre os outros, e o primeiro a ser removido é sempre o de cima - afinal, se tentarmos remover o de baixo, é possível que derrubemos todos os outros.

funcao1

Assim, o PHP consegue construir a trilha de execução de forma bastante simples. Após executar a saída da funcao1(), ele pode se livrar desse outro espaço de memória. voltando apenas para a main, nosso programa principal.

funcao4

Terminada a execução do programa principal, o espaço de memória reservado a ele também é descartado. Devido a esse comportamento de "empilhar", o local onde as variáveis e funções são armazenadas é chamado de stack, que significa "pilha" em inglês. Ou seja, estamos representando aqui a pilha de execução de um programa, incluindo todas as chamadas de funções e cada uma de suas variáveis.

Outro detalhe interessante é que main, palavra muito conhecida por quem programa em C, é o nome da função que dá início à execução de um programa. Como o PHP foi feito utilizando instruções em C, ele também chama esse programa principal de main. No próximo vídeo inclusive aprenderemos como verificar no código como esse programa está sendo executado.

Agora imagine que a funcao1() tenha uma instrução return que nos devolve o valor 2. Quando essa função deixa de ser executada, a main passa a ter um espaço na memória dedicado ao valor retornado - algo que talvez esclareça um pouco o conceito de retorno de funções.

Como comentamos no início do vídeo anterior, queremos entender o conceito de "pilha" a fundo de modo a conseguirmos rastrear problemas na trilha de execução, algo que em inglês é chamado de stack trace, até encontrarmos e entendermos o que ocasionou esses problemas. Vale citar que o PHP não é a única linguagem de programação que funciona dessa forma - pelo contrário, todas as linguagens que nosso instrutor conhece funciona dessa maneira, com um espaço de memória que encadeia as execuções e variáveis locais em forma de pilha.

Existem outros detalhes a respeito do funcionamento de um programa, por exemplo quando trabalhamos com funções globais, referências, objetos e assim por diante, mas não abordaremos tais conceitos nesse curso pois fogem bastante ao nosso tema. No próximo vídeo veremos como o PHP pode nos mostrar a pilha de execução no código.

Sobre o curso PHP Exceptions: tratamento de erros

O curso PHP Exceptions: tratamento de erros possui 146 minutos de vídeos, em um total de 62 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas