PHP tente…pegue

Resumo : neste tutorial, você aprenderá como usar a try...catchinstruçã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...catchinstrução. Aqui está uma sintaxe típica da try...catchinstruçã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...catchinstrução possui dois blocos: trye catch.

No trybloco, você realiza algumas tarefas, por exemplo, ler um arquivo. Se ocorrer uma exceção, a execução salta para o catchbloco.

No catchbloco, 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.csvarquivo 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 5Linguagem de código:  texto simples  ( texto simples )

Para corrigir isso, você pode adicionar uma ifinstruçã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...catchinstruçã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...catchbloco 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 catchbloco.

A variável de exceção $exé uma instância da Exceptionclasse que contém as informações detalhadas do erro. Neste exemplo, obtemos a mensagem de erro detalhada chamando o getMessage()método do $exobjeto.

Vários blocos de captura

Uma try...catchinstrução pode ter vários catchblocos. Cada catchbloco 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...catchinstrução possui vários catchblocos, a ordem de exceção deve ser do específico ao genérico. E o último catchbloco deve conter o código para tratar a exceção mais genérica. Ao fazer isso, a try...catchinstruçã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 catchbloco 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 catchbloco, 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 catchbloco ainda será executado, mas não terá acesso ao Exceptionobjeto.

Resumo

  • Use a try...catchinstrução para lidar com exceções.
  • A try...catchinstruçã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 catchbloco 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *