1
resposta

Faz sentido assinar catch(Exception $exception) e não usar?

Olá, estou enviando essa pergunta mais para deixar registrado minha opinião.

Não é boa prática em programação declarar variáveis e não usá-las, de igual maneira isso se aplica às assinaturas dos métodos e funções, tanto que para tal, existem valores "default".

No exemplo oferecido pelo instrutor, é recomendado reaproveitar a InvalidArgumentException, o que está correto, mas propõe que a mensagem seja inserida no bloco catch.

Nesse caso, como o PHP obrigou a passar o tipo e criou uma variável catch (InvalidArgumentException $exception), o mais sensato seria colocar essa mensagem exatamente onde foi jogada (throw), até porque, o método em questão deposita poderia vir a ter mais de um InvalidArgumentException e isso precisaria ser feito sobremaneira.

Então ao invés de:

public function deposita(float $valorADepositar): void
{
    if ($valorADepositar < 0) {
        throw new \InvalidArgumentException();
    }

    $this->saldo += $valorADepositar;
}
...
try {
    $conta->deposita(-100);
} catch (InvalidArgumentException $exception) {
    echo "Valor a depositar precisa ser positivo, seu hacker perigoso." . PHP_EOL;
}

O mais sensato seria:

public function deposita(float $valorADepositar): void
{
    if ($valorADepositar < 0) {
        throw new \InvalidArgumentException(
            "Valor a depositar precisa ser positivo, seu hacker perigoso." 
        );
    }

    $this->saldo += $valorADepositar;
}
...
try {
    $conta->deposita(-100);
} catch (InvalidArgumentException $exception) {
    echo $exception->getMessage()  . PHP_EOL;
}

Todavia, no PHP 8 é possível fazer parcialmente o que o Instrutor propôs removendo a variável e deixando somente o tipo, usando um recurso chamado "non-capturing catches" ou "catch"s não capturáveis, ou seja:

...
try {
    $conta->deposita(-100);
} catch (InvalidArgumentException) {
    echo "Valor a depositar precisa ser positivo, seu hacker perigoso." . PHP_EOL;
}

Todavia, ainda assim, podemos ter a questão de vários InvalidArgumentException dentro do mesmo método, o que nos obrigaria a voltar ao mecanismo onde usamos a variável e o getMessage().

1 resposta

Oi Gilberto, como vai?

Obrigado por compartilhar esse conhecimento aqui no fórum, certamente auxiliou e irá auxiliar muitas pessoas.

Continue compartilhando seu conhecimento no fórum, aqui todo conhecimento é bem-vindo!

Caso tenha quaisquer comentários ou dúvidas a respeito de alguma aula ou desafio, pode postar aqui no fórum que vamos te responder!

Abraços e bons estudos!