π ΠΠ»Π°Π²Π° 24. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π² PHP
- π₯ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
- π§ͺ try / catch / finally
- βοΈ ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
- π― Π‘Π²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Exception
- π§° Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
- π§΅ ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
- π‘ ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠΎΠ²Π΅ΡΡ
- π ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°: ErrorException Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ
- β Π§ΡΠΎ ΡΡ ΡΡΠ²ΠΎΠΈΠ»
- β Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅
ΠΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ΅ΠΌΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ.
π₯ Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅?
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ (Exception) — ΡΡΠΎ ΡΠΏΠΎΡΠΎΠ± ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° «ΠΏΠ°Π΄Π°Π»Π°», ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΉΠΌΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Ρ.
β οΈ ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ die()
ΠΈ echo "Error"
?
ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ:
-
die()
ΡΠ±ΠΈΠ²Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ° -
Π½Π΅Ρ Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ
-
Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ
π§ͺ try / catch / finally
ΠΡΠΈΠΌΠ΅Ρ:
try {
// ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
$result = divide(10, 0);
} catch (Exception $e) {
// ΠΠ΅ΡΠ΅Ρ
Π²Π°Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
echo "ΠΡΠΈΠ±ΠΊΠ°: " . $e->getMessage();
} finally {
echo "ΠΡΠΎΡ Π±Π»ΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²ΡΠ΅Π³Π΄Π°";
}
βοΈ ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
function divide(int $a, int $b): float {
if ($b === 0) {
throw new Exception("ΠΠ΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ»Ρ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½ΠΎ");
}
return $a / $b;
}
-
throw
— Π²ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ -
Exception
— Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
π― Π‘Π²ΠΎΠΉΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Exception
-
$e->getMessage()
— ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ -
$e->getCode()
— ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ -
$e->getFile()
— Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ -
$e->getLine()
— ΡΡΡΠΎΠΊΠ° -
$e->getTrace()
— ΡΡΠ΅ΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ² -
$e->getTraceAsString()
— ΠΊΠ°ΠΊ ΡΡΡΠΎΠΊΠ°
π§° Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΠΊΠ° ΠΊΠ»Π°ΡΡΠ° Exception
:
class InvalidUserInputException extends Exception {}
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ:
function registerUser(string $email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidUserInputException("ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ email");
}
}
π§΅ ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
try {
// ...
} catch (InvalidUserInputException $e) {
// ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ
} catch (DatabaseException $e) {
// ΠΡΠΈΠ±ΠΊΠΈ ΠΠ
} catch (Exception $e) {
// ΠΡΡΠ°Π»ΡΠ½ΠΎΠ΅
}
π‘ ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠΎΠ²Π΅ΡΡ
-
ΠΡΠ΅Π³Π΄Π° ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°ΠΉ ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ° Π²
try/catch
-
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ ΡΠ²ΠΎΠΈ ΠΊΠ»Π°ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ
-
ΠΠ΅ Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±Π»ΡΠΉ — ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π½Π΅ Π·Π°ΠΌΠ΅Π½Π° ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ
-
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉ
finally
Π΄Π»Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ²
π ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°: ErrorException
Π΄Π»Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠΉ
PHP ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ:
set_error_handler(function ($severity, $message, $file, $line) {
throw new ErrorException($message, 0, $severity, $file, $line);
});
Π’Π΅ΠΏΠ΅ΡΡ warning
ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡΡ Π² Exception
.
β Π§ΡΠΎ ΡΡ ΡΡΠ²ΠΎΠΈΠ»:
-
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
try/catch
Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° -
ΠΠ°ΠΊ Π²ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Ρ
throw
-
ΠΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ
-
ΠΠ°ΠΊ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΎΡΠΈΠ±ΠΎΠΊ
-
ΠΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
finally
β Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅:
ΠΠΎΠ³ΠΎΠ²ΠΎΡΠΈΠΌ ΠΎ Π°Π²ΡΠΎΠ·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ², Composer, PSR-4, ΠΈ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½Ρ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ PHP-ΠΏΡΠΎΠ΅ΠΊΡΡ — ΠΏΠΎΠ΄Π²Π΅Π΄ΡΠΌ ΠΈΡΠΎΠ³ ΠΠΠ ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅.