Π‘Ρ‚Π°Ρ‚ΡŒΡ

πŸ“˜ Π“Π»Π°Π²Π° 24. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок Π² PHP

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Ρ‚Π΅ΠΌΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок.

πŸ’₯ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅?

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (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-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ — ΠΏΠΎΠ΄Π²Π΅Π΄Ρ‘ΠΌ ΠΈΡ‚ΠΎΠ³ ООП ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.

PHP
Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ