# Żbalji u exceptions f'PHP

> Żbalji u exceptions f'PHP: Throwable, Error u Exception, try/catch/finally, handlers globali u issettjar sigur għall-wiri tal-iżbalji u għal-logs.

Sors: https://phpsos.de/mt/php/fehler-und-exceptions/  
Stat: 25/10/2026  
Fornitur: PHP SOS, Għajnuna ta' emerġenza għal PHP u sigurtà tas-server. Għajnuna immedjata fuq WhatsApp: https://wa.me/491736494914?text=Bongu%20PHP%20SOS%2C%20g%C4%A7andna%20b%C5%BConn%20g%C4%A7ajnuna%20bis-server%20tal-PHP%20tag%C4%A7na.%20Kumpanija%3A%20%E2%80%A6%20Websajt%3A%20%E2%80%A6

**Fil-qosor:** PHP jirrapporta problemi b'żewġ modi: bħala żbalji klassiċi bħal twissijiet u noti, ikkontrollati permezz ta' `error_reporting`, u bħala exceptions li jistgħu jinqabdu b'`try` u `catch`. Minn PHP 7 il-quddiem, ħafna żbalji interni jitfgħu wkoll oġġett tal-klassi `Error`; flimkien ma' `Exception` jimplimenta l-interface `Throwable`. Fil-produzzjoni japplika: l-iżbalji jiġu rreġistrati, qatt murija fil-browser. Fuq PHP 8.5, minħabba PHP2Shell, `fatal_error_backtraces=0` jagħmel parti wkoll mill-miżuri temporanji.

## Żewġ dinjiet: żbalji klassiċi u exceptions

PHP joriġina minn żmien meta l-iżbalji kienu jinħarġu l-aktar bħala messaġġ: noti (`E_NOTICE`), twissijiet (`E_WARNING`), funzjonijiet skaduti (`E_DEPRECATED`) u żbalji fatali (`E_ERROR`). Ħafna minn dawn il-messaġġi jħallu l-iskript ikompli, spiss b'data żbaljata jew vojta.

L-exceptions jaħdmu b'mod differenti. Jinterrompu l-fluss normali u jaqbżu għall-blokk `catch` li jaqbel li jmiss. Jekk ma jinstab l-ebda wieħed, l-iskript jintemm. Għal min jieħu d-deċiżjonijiet id-differenza hija importanti: twissija siekta tista' twassal biex ordni tinħażen mhux kompluta mingħajr ma jinduna ħadd. Exception tagħmel il-problema viżibbli u jista' jiġi mmaniġġjat.

Benefiċċju sottovalutat tal-messaġġi klassiċi huma n-noti tat-tip `E_DEPRECATED`. Dawn jħabbru li mezz tal-lingwa jitneħħa f'verżjoni futura ta' PHP. Min jiġborhom fil-log u jevalwahom regolarment, jaf qabel upgrade liema postijiet jeħtieġu aġġustament, u fil-każ ta' vulnerabbiltà urġenti tas-sigurtà ma jkollux għalfejn jittestja fit-tul l-ewwel.

## Il-ġerarkija Throwable

Dak kollu li jista' jintefa' b'`throw` u jinqabad b'`catch` jimplimenta `Throwable`. Taħtu hemm żewġ friegħi:

| Klassi | Skop | Eżempji ta' subklassijiet |
|---|---|---|
| `Exception` | żbalji prevedibbli tal-applikazzjoni u tal-estensjonijiet | `ErrorException`, `PDOException`, klassijiet proprji |
| `Error` | żbalji interni ta' PHP | `TypeError`, `ValueError`, `ArgumentCountError`, `ArithmeticError`, `DivisionByZeroError`, `UnhandledMatchError` |

Klassijiet proprji ta' żbalji jiddiskendu minn `Exception`, mhux minn `Error`. Minn PHP 8.0 il-biċċa l-kbira tal-funzjonijiet interni, f'każ ta' parametri invalidi, jitfgħu `TypeError` jew `ValueError`, minflok ma joħorġu biss twissija. `strlen([])` huwa każ bħal dan.

## try, catch u finally fil-prattika

```php
<?php
declare(strict_types=1);

final class ZahlungFehlgeschlagen extends RuntimeException {}

function bezahlen(Bestellung $b, Zahlungsdienst $dienst, LoggerInterface $log): bool
{
    try {
        $dienst->belasten($b->betrag(), $b->referenz());
        return true;
    } catch (ZahlungFehlgeschlagen $e) {
        $log->warning('Zahlung abgelehnt', ['bestellung' => $b->id(), 'exception' => $e]);
        return false;
    } catch (TimeoutException | VerbindungsFehler) {
        // minn PHP 8.0 il-varjabbli fil-catch hija fakultattiva
        $log->error('Zahlungsdienst nicht erreichbar', ['bestellung' => $b->id()]);
        return false;
    } finally {
        $dienst->verbindungSchliessen();
    }
}
```

Diversi klassijiet jistgħu jingħaqdu f'`catch` wieħed b'`|`. Il-blokk `finally` dejjem jaħdem, kemm jekk seħħ żball kif ukoll jekk le. Minn PHP 8.0 `throw` huwa wkoll espressjoni u jista' jidher pereżempju wara `??`: `$id = $_GET['id'] ?? throw new InvalidArgumentException('id fehlt');`.

## Handlers globali: set_error_handler u set_exception_handler

Żewġ funzjonijiet jaqbdu dak li altrimenti jgħaddi. `set_exception_handler()` jirreġistra funzjoni għal Throwables li ma nqabdux. Skont il-manwal l-iskript jintemm wara li titqabbad; għalhekk tajba għar-reġistrazzjoni u għal paġna newtrali tal-iżbalji, mhux biex titkompla x-xogħol.

Handler li kiteb l-iżball sħiħ fil-log b'ħin u b'identifikatur każwali, u juri lill-viżitatur biss paġna newtrali b'dan l-identifikatur, ħadem tajjeb fil-prattika. L-appoġġ imbagħad jista' jsib il-każ mill-ġdid fil-log mingħajr ma dettalji interni jaslu 'l barra.

`set_error_handler()` jaqbad żbalji klassiċi. Il-manwal juri kif jinbidlu f'`ErrorException`, biex it-twissijiet jiġu mmaniġġjati bħal exceptions:

```php
<?php
set_error_handler(function (int $nr, string $text, string $datei, int $zeile): bool {
    if (!(error_reporting() & $nr)) {
        return false; // eskluż minn error_reporting
    }
    if ($nr === E_DEPRECATED || $nr === E_USER_DEPRECATED) {
        return false; // ma tiskalax noti dwar dak li huwa skadut
    }
    throw new ErrorException($text, 0, $nr, $datei, $zeile);
});
```

Żbalji fatali bħal overflow tal-memorja ma jistgħux jinqabdu b'dan il-mod. X'jiġri ġewwa f'overflow tispjegah il-paġna [memory_limit u Out-of-Memory](https://phpsos.de/mt/php/out-of-memory/).

## Konfigurazzjoni tal-wiri tal-iżbalji u tar-reġistrazzjoni

L-aktar issettjar importanti bil-valuri standard tagħhom skont il-manwal:

| Issettjar | Standard | Rakkomandazzjoni għall-produzzjoni |
|---|---|---|
| `error_reporting` | `E_ALL` minn PHP 8.0.0 | `E_ALL` |
| `display_errors` | `1` | `Off` |
| `display_startup_errors` | `1` minn PHP 8.0.0 | `Off` |
| `log_errors` | `0` | `On` |
| `error_log` | vojt (log tas-server tal-web jew tas-SAPI) | fajl proprju barra mill-webroot |
| `fatal_error_backtraces` | `1`, ġdid f'PHP 8.5.0 | temporanjament `0` (PHP2Shell) |

Minn PHP 8.2.0 `error_log_mode` jistabbilixxi d-drittijiet tal-fajl tal-log, b'mod awtomatiku `0644`. Jekk il-logs fihom data personali jew mogħdijiet, valur aktar strett għandu sens, biex utenti oħra fuq is-server ma jkunux jistgħu jaqrawhom. B'`ignore_repeated_errors` messaġġi identiċi mill-istess fajl u linja jistgħu jingħaqdu, biex ċiklu ta' żbalji ma jgħarraqx il-log.

Il-`php.ini-production` mogħti flimkien diġà jissettja `display_errors` fuq `Off`. Skont il-manwal `ini_set('display_errors', ...)` waqt it-tħaddim ma jaffettwax żbalji fatali, u żbalji ta' sintassi jidhru qabel ma jaħdem xi `ini_set()`. Għalhekk dawn il-valuri jappartjenu fil-konfigurazzjoni tas-server. L-isfond jinsab fl-artikolu [Itfi l-wiri tal-iżbalji fil-produzzjoni](https://phpsos.de/mt/blog/display-errors-produktion/); kif il-logs jinżammu mingħajr tnixxija ta' data, fl-artikolu [Reġistrazzjoni sigura](https://phpsos.de/mt/blog/sicher-loggen-php/).

## Immaniġġjar tal-iżbalji u PHP2Shell

Għal PHP 8.5 php.net isemmi bħala waħda mill-miżuri temporanji kontra PHP2Shell li jiġi ssettjat `fatal_error_backtraces=0` u li PHP jerġa' jinbeda wara. Il-miżuri l-oħra jirrigwardaw `memory_limit`, `post_max_size` u `session.upload_progress.enabled`. L-ebda waħda minnhom ma tieħu post l-aġġornament għal PHP 8.5.12, 8.4.27, 8.3.36 jew 8.2.35.

```ini
; PHP 8.5 biss, f'php.ini jew fil-pool ta' FPM, wara erġgħu ibdew il-workers kollha
fatal_error_backtraces = 0
```

Il-logs tal-iżbalji huma wkoll evidenza importanti wara PHP2Shell. Jekk mill-20 ta' Ottubru 2026 jaqbżu żbalji tal-memorja jew workers interrotti, dan jista' jindika tentattivi ta' attakk, imma jista' jkollu wkoll kawżi bla ħsara. Żommu l-logs u evalwawhom flimkien mal-logs tal-aċċess, kif deskritt fil-gwida [Evalwazzjoni tal-logs tas-server tal-web wara attakk](https://phpsos.de/mt/ratgeber/logfiles-auswerten/).

## Kif jgħin PHP SOS konkretament?

- Niċċekkjaw l-issettjar effettiv għall-wiri tal-iżbalji u għar-reġistrazzjoni għal kull websajt u nsettjawh b'mod adattat għall-produzzjoni.
- Napplikaw il-miżuri temporanji ta' PHP2Shell skont il-verżjoni ta' PHP u nerġgħu nibdew il-workers kollha.
- Nissalvaw il-logs tal-iżbalji u tal-aċċess mill-20 ta' Ottubru 2026 u nevalwawhom għal anomaliji.
- Bħala parti mill-[Monitoraġġ tas-sigurtà](https://phpsos.de/mt/leistungen/security-monitoring/) nirrappurtaw akkumulazzjonijiet mhux tas-soltu ta' żbalji, minflok inħalluhom jisparixxu fil-log.


## Mistoqsijiet frekwenti

**X'inhi d-differenza bejn Error u Exception?**  
It-tnejn jimplimentaw l-interface Throwable. Exception hija maħsuba għal żbalji li applikazzjoni tistenna u timmaniġġja, pereżempju konnessjoni falluta mad-database. Error tirrappreżenta żbalji interni ta' PHP bħal TypeError jew diviżjoni b'żero.

**Għandu display_errors ikun mixgħul fil-produzzjoni?**  
Le. Messaġġi ta' żball fil-browser iżvelaw mogħdijiet, mistoqsijiet u xi drabi data ta' aċċess. Fil-produzzjoni display_errors għandu jkun Off u log_errors On, biex l-iżbalji jispiċċaw fil-log minflok għand il-viżitatur.

**Jista' jinqabad bi try/catch overflow tal-memorja?**  
Le. Jekk skript jaqbeż memory_limit, PHP jtemmu b'żball fatali li ma jistax jinqabad bħala exception. Jidher biss fil-log tal-iżbalji, sakemm log_errors ikun attiv.

**X'inhi fatal_error_backtraces?**  
Issettjar li jeżisti minn PHP 8.5.0 u li jżid backtrace ma' żbalji fatali. Hija attiva b'mod awtomatiku. Bħala miżura temporanja kontra PHP2Shell, php.net jissuġġerixxi għal PHP 8.5 li tiġi ssettjata fuq 0 u li PHP jerġa' jinbeda wara.

## Sorsi

- [Manwal ta' PHP: Konfigurazzjoni tal-immaniġġjar tal-iżbalji](https://www.php.net/manual/de/errorfunc.configuration.php)
- [Manwal ta' PHP: Il-klassi Error](https://www.php.net/manual/de/class.error.php)
- [Manwal ta' PHP: ErrorException](https://www.php.net/manual/en/class.errorexception.php)
- [Manwal ta' PHP: set_exception_handler](https://www.php.net/manual/en/function.set-exception-handler.php)
- [php.net: Avviżi tas-sigurtà](https://www.php.net/)
