Try, Catch, Finally
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 68 di 91.
Ora che sai come creare e generare eccezioni, devi imparare a intercettarle. La struttura try-catch-finally ti permette di gestire le eccezioni in modo corretto, invece di lasciare che mandino in crash la tua applicazione.
Racchiudi il codice che potrebbe generare un'eccezione in un blocco try, quindi gestisci l'eccezione in un blocco catch:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
Output:
Error: Cannot divide by zeroPuoi intercettare diversi tipi di eccezioni con più blocchi catch. PHP li controlla in ordine, quindi inserisci prima le eccezioni più specifiche:
<?php
try {
// codice rischioso
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
Il blocco finally viene eseguito indipendentemente dal fatto che sia stata generata o intercettata un'eccezione. È perfetto per le attività di pulizia, come chiudere le connessioni:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
Output:
Attempting operation
Caught: Failed
Cleanup completeIl blocco finally viene eseguito anche se restituisci un valore dall'interno dei blocchi try o catch, rendendolo affidabile per le operazioni di pulizia essenziali.
Sfida
FacileCostruiamo un sistema di elaborazione dei file che mostri come try-catch-finally collaborano per gestire gli errori in modo appropriato, assicurandosi che la pulizia venga sempre eseguita.
Organizzerai il codice in tre file:
FileException.php: crea una classe personalizzataFileExceptionche estendeException. Rappresenterà gli errori relativi ai file nel tuo sistema.FileProcessor.php: crea una classeFileProcessorche simula le operazioni sui file. Includi il file FileException. La tua classe deve avere:- Una proprietà booleana privata
$isOpeninizializzata afalse - Un metodo
open(string $filename): voidche imposta$isOpensutruee stampa"Opening: [filename]". Se il nome del file è"invalid.txt", lancia unaFileExceptioncon il messaggio"Cannot open file" - Un metodo
process(): voidche stampa"Processing file...". Se$isOpenèfalse, lancia unaRuntimeExceptioncon il messaggio"File not open" - Un metodo
close(): voidche imposta$isOpensufalsee stampa"File closed" - Un metodo
isOpen(): boolche restituisce lo stato corrente
- Una proprietà booleana privata
main.php: includi il file FileProcessor. Riceverai un input: un nome di file.Crea un
FileProcessore usa una strutturatry-catch-finallyper:- Nel blocco
try: chiamaopen()con il nome del file, quindi chiamaprocess() - Gestisci prima
FileExceptione stampa"File error: [message]" - Gestisci
RuntimeExceptione stampa"Runtime error: [message]" - Nel blocco
finally: controlla se il file è aperto usandoisOpen()e, in caso affermativo, chiamaclose(). Poi stampa"Cleanup complete"
- Nel blocco
Il blocco finally assicura che la pulizia venga eseguita sia in caso di successo sia in caso di errore delle operazioni. Questo schema è essenziale per gestire risorse come file, connessioni al database o socket di rete, per le quali la pulizia deve avvenire indipendentemente da ciò che succede durante l'elaborazione.
Provalo tu
<?php
require_once 'FileProcessor.php';
// Leggi l'input
$filename = trim(fgets(STDIN));
// TODO: Crea un'istanza di FileProcessor
// TODO: Usa la struttura try-catch-finally:
// - Nel blocco try: chiama open() con il nome del file, poi chiama process()
// - Intercetta prima FileException e stampa "File error: [message]"
// - Intercetta RuntimeException e stampa "Runtime error: [message]"
// - Nel blocco finally: verifica se il file è aperto usando isOpen(); in tal caso, chiama close()
// Poi stampa "Cleanup complete"
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online