Resumo : neste tutorial, você aprenderá como usar a try...catch
instrução PHP para tratar exceções.
Introdução à instrução try…catch do PHP
Na programação, erros inesperados são chamados de exceções. As exceções podem ser a tentativa de ler um arquivo que não existe ou a conexão com o servidor de banco de dados que está inativo no momento.
Em vez de interromper o script, você pode lidar com as exceções normalmente. Isso é conhecido como tratamento de exceções.
Para lidar com as exceções, você usa a try...catch
instrução. Aqui está uma sintaxe típica da try...catch
instrução:
<?php
try {
// perform some task
} catch (Exception $ex) {
// jump to this part
// if an exception occurred
}
Linguagem de código: HTML, XML ( xml )
Nesta sintaxe, a try...catch
instrução possui dois blocos: try
e catch
.
No try
bloco, você realiza algumas tarefas, por exemplo, ler um arquivo. Se ocorrer uma exceção, a execução salta para o catch
bloco.
No catch
bloco, você especifica o nome da exceção e o código para tratar uma exceção específica.
PHP tente… pegue exemplo
O exemplo a seguir mostra como ler dados de um arquivo CSV:
<?php
$data = [];
$f = fopen('data.csv', 'r');
do {
$row = fgetcsv($f);
$data[] = $row;
} while ($row);
fclose($f);
Linguagem de código: HTML, XML ( xml )
Se o data.csv
arquivo não existir, você receberá muitos avisos. O seguinte mostra o primeiro aviso:
PHP Warning: fopen(data.csv): failed to open stream: No such file or directory in ... on line 5
Linguagem de código: texto simples ( texto simples )
Para corrigir isso, você pode adicionar uma if
instrução em cada etapa:
<?php
$data = [];
$f = fopen('data1.csv', 'r');
if (!$f) {
echo 'The file is not accessible.';
exit;
}
do {
$row = fgetcsv($f);
if ($row === null) {
echo 'The stream is invalid.';
exit;
}
if ($row === false) {
echo 'Other errors occurred.';
exit;
}
$data[] = $row;
} while ($row);
// close the file
if (!$f) {
fclose($f);
}
print_r($data);
Linguagem de código: HTML, XML ( xml )
No entanto, esse código mistura a lógica do programa e os manipuladores de erros.
A vantagem da try...catch
instrução é separar a lógica do programa dos manipuladores de erros. Portanto, torna o código mais fácil de seguir.
A seguir ilustra como usar o try...catch
bloco para leitura de dados de um arquivo CSV:
<?php
$data = [];
try {
$f = fopen('data.csv', 'r');
do {
$row = fgetcsv($f);
$data[] = $row;
} while ($row);
fclose($f);
} catch (Exception $ex) {
echo $ex->getMessage();
}
Linguagem de código: HTML, XML ( xml )
Neste exemplo, se ocorrer algum erro no try...block
, a execução salta para o catch
bloco.
A variável de exceção $ex
é uma instância da Exception
classe que contém as informações detalhadas do erro. Neste exemplo, obtemos a mensagem de erro detalhada chamando o getMessage()
método do $ex
objeto.
Vários blocos de captura
Uma try...catch
instrução pode ter vários catch
blocos. Cada catch
bloco tratará uma exceção específica:
<?php
try {
//code...
} catch (Exception1 $ex1) {
// handle exception 1
} catch (Exception2 $ex2) {
// handle exception 2
} catch (Exception1 $ex3) {
// handle exception 3
}
...
Linguagem de código: HTML, XML ( xml )
Quando uma try...catch
instrução possui vários catch
blocos, a ordem de exceção deve ser do específico ao genérico. E o último catch
bloco deve conter o código para tratar a exceção mais genérica. Ao fazer isso, a try...catch
instrução pode capturar todas as exceções.
Se você tiver o mesmo código que lida com vários tipos de exceções, poderá colocar várias exceções em um catch
bloco e separá-las pelo |
caractere de barra vertical ( ) como este:
<?php
try {
//code...
} catch (Exception1 | Exception2 $ex12) {
// handle exception 1 & 2
} catch (Exception3 $ex3) {
// handle exception 3
}
Linguagem de código: HTML, XML ( xml )
Ao especificar múltiplas exceções no catch
bloco, você pode evitar a duplicação de código. Este recurso é suportado desde o PHP 7.1.0.
Ignorando a variável de exceção
A partir do PHP 8.0, o nome da variável para a exceção capturada é opcional assim:
<?php
try {
//code...
} catch (Exception) {
// handle exception
}
Linguagem de código: HTML, XML ( xml )
Neste caso, o catch
bloco ainda será executado, mas não terá acesso ao Exception
objeto.
Resumo
- Use a
try...catch
instrução para lidar com exceções. - A
try...catch
instrução separa a lógica do programa e os manipuladores de exceções. - Use vários blocos catch para lidar com várias exceções. Coloque a exceção mais específica primeiro e a exceção menos específica depois.
- Especifique uma lista de exceções separadas por pipe em um único
catch
bloco se o mesmo código puder lidar com várias exceções. - Ignore a variável de exceção quando não quiser acessar os detalhes da exceção.