PHP tente…pegue…finalmente

Resumo : neste tutorial, você aprenderá como usar a try...catch...finallyinstrução PHP para lidar com exceções e limpar os recursos.

Introdução à instrução try…catch…finally do PHP

A instrução try…catch permite lidar com exceções. Quando ocorre uma exceção no trybloco, a execução salta para o catchbloco. No catchbloco, você pode colocar o código que trata a exceção.

O exemplo a seguir usa o bloco try…catch para ler um arquivo CSV em um array :

<?php

$data = [];

try {
	$f = fopen('data.csv', 'r');

	while ($row = $fgetcsv($f)) {
		$data[] = $row;
	}

	fclose($f);
} catch (Exception $ex) {
	echo $ex->getMessage();
}
Linguagem de código:  HTML, XML  ( xml )

Neste exemplo, caso ocorra um erro na leitura do arquivo, a execução salta para o catchbloco. Portanto, a seguinte instrução nunca será executada:

fclose($f);Linguagem de código:  PHP  ( php )

Quando o arquivo não é fechado corretamente, ele pode ficar inacessível posteriormente.

Para garantir que o arquivo será fechado corretamente, independentemente de qualquer exceção ocorrer ou não, você pode fechar o arquivo no finallybloco assim:

<?php

$data = [];

try {
	$f = fopen('data.csv', 'r');

	while ($row = $fgetcsv($f)) {
		$data[] = $row;
	}
} catch (Exception $ex) {
	echo $ex->getMessage();
} finally {
	if ($f) {
		fclose($f);
	}
}
Linguagem de código:  HTML, XML  ( xml )

O finallyé um bloco opcional da instrução try…catch. O finallybloco sempre é executado após o bloco tryou catch.

Neste caso, se ocorrer uma exceção durante a leitura do arquivo, a execução salta para o catchbloco para tratá-la e então o finallybloco executa para fechar o arquivo.

A sintaxe do try...catch...finallybloco é a seguinte:

<?php

try {
	// do something
} catch (Exception $e) {
	// code to handle exception
} finally {
	// code to clean up the resource
}Linguagem de código:  HTML, XML  ( xml )

PHP finalmente e retorno

A seguir define a divide()função que retorna a divisão de dois números. Se ocorrer um erro, ele retornará null.

<?php

function divide($x, $y)
{
	try {
		$result = $x / $y;

		return $result;
	} catch (Exception $e) {
		return null;
	} finally {
		return null;
	}
}Linguagem de código:  HTML, XML  ( xml )

No entanto, o seguinte exibe NULL em vez de 5:

<?php
// ...
$result = divide(10, 2);
var_dump($result); // NULLLinguagem de código:  HTML, XML  ( xml )

Normalmente, a returninstrução interrompe imediatamente a execução e retorna um valor. No entanto, não funciona dessa maneira quando é usado com a try...catch...finallyinstrução.

Quando você usa a returninstrução com a try...catch...finallyinstrução, o bloco final ainda é executado após a returninstrução.

O resultado será retornado após a finallyexecução do bloco. Além disso, se o finallybloco tiver uma returninstrução, o valor do finallybloco será retornado.

A declaração try…finalmente

Na try...catch..finallyinstrução, o bloco catchou finallyé opcional. Portanto, você pode ter a try...finallydeclaração assim:

<?php 
try {
	// do something
} finally {
	// clean up
}Linguagem de código:  HTML, XML  ( xml )

A try...finallyinstrução permite lançar uma exceção enquanto limpa o recurso adequadamente.

Resumo

  • Use a try...catch...finallyinstrução para lidar com exceções e limpar os recursos.
  • O finallybloco sempre é executado após o bloco try ou catch.
  • Se tryou catchtiver a returninstrução, o valor será retornado somente após a finallyexecução do bloco.

Deixe um comentário

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