Start · Sprachen · PHP · Referenz · PharException

PharException

Klasse

Phar-spezifische Ausnahmeklasse, die bei Fehlern im Zusammenhang mit <code>Phar</code>- und <code>PharData</code>-Operationen geworfen wird.

seit PHP 5.3.0 Kategorie: error

Signatur

class PharException extends RuntimeException

Beschreibung

PharException erbt von RuntimeException und wird von der Phar-Erweiterung geworfen, wenn während der Arbeit mit Phar-Archiven ein Fehler auftritt – z. B. beim Erstellen, Öffnen, Lesen oder Modifizieren von .phar-Dateien.

Da PharException eine eigene Klasse ist, lässt sie sich gezielt in einem catch-Block abfangen, ohne andere RuntimeException-Fehler zu behandeln. Das erlaubt saubere Fehlerbehandlung in Anwendungen, die Phar-Archive erzeugen oder ausliefern.

Typische Auslöser sind fehlende Schreibrechte (phar.readonly in der php.ini ist aktiv), ungültige Archiv-Signaturen, beschädigte Archive oder der Versuch, ein nicht existierendes Phar zu öffnen.

Eigene Unterklassen von PharException können erstellt werden, um anwendungsspezifische Phar-Fehler zu modellieren, obwohl dies in der Praxis selten notwendig ist.

Beispiele

PharException beim Öffnen eines ungültigen Archivs abfangen

<?php
try {
    // Versucht, eine nicht existierende oder ungültige Phar-Datei zu öffnen
    $phar = new Phar('/pfad/zu/ungueltig.phar');
} catch (PharException $e) {
    echo 'Phar-Fehler: ' . $e->getMessage() . PHP_EOL;
    echo 'Code: ' . $e->getCode() . PHP_EOL;
} catch (RuntimeException $e) {
    echo 'Allgemeiner Laufzeitfehler: ' . $e->getMessage() . PHP_EOL;
}
Phar-Fehler: internal corruption of phar "/pfad/zu/ungueltig.phar" (truncated entry)

PharException beim Erstellen eines Archivs behandeln

<?php
// phar.readonly muss in der php.ini auf 0 gesetzt sein
try {
    $phar = new Phar('/tmp/meinarchiv.phar');
    $phar->startBuffering();
    $phar->addFromString('index.php', '<?php echo "Hallo Welt";');
    $phar->setStub($phar->createDefaultStub('index.php'));
    $phar->stopBuffering();
    echo 'Phar erfolgreich erstellt.' . PHP_EOL;
} catch (PharException $e) {
    echo 'Fehler beim Erstellen des Phar-Archivs: ' . $e->getMessage() . PHP_EOL;
    // Aufräumen, Logging, Benachrichtigung etc.
}
Phar erfolgreich erstellt.

Eigene Unterklasse von PharException

<?php
class MeinPharException extends PharException
{
    public function __construct(string $archivPfad, string $grund)
    {
        parent::__construct(
            sprintf('Phar-Archiv "%s" konnte nicht verarbeitet werden: %s', $archivPfad, $grund)
        );
    }
}

function ladePhar(string $pfad): Phar
{
    if (!file_exists($pfad)) {
        throw new MeinPharException($pfad, 'Datei nicht gefunden');
    }
    try {
        return new Phar($pfad);
    } catch (PharException $e) {
        throw new MeinPharException($pfad, $e->getMessage());
    }
}

try {
    $phar = ladePhar('/tmp/existiert_nicht.phar');
} catch (MeinPharException $e) {
    echo $e->getMessage() . PHP_EOL;
}
Phar-Archiv "/tmp/existiert_nicht.phar" konnte nicht verarbeitet werden: Datei nicht gefunden

// Wichtig · Fallstricke

Achtung: Standardmäßig ist in vielen PHP-Installationen die INI-Einstellung phar.readonly = 1 aktiv. Das Erstellen oder Modifizieren von Phar-Archiven löst dann eine PharException aus. Diese Einstellung muss explizit in der php.ini oder per -d phar.readonly=0 deaktiviert werden.

Da PharException von RuntimeException erbt, wird sie auch von einem catch (RuntimeException $e)-Block abgefangen. Um Phar-spezifische Fehler gesondert zu behandeln, sollte PharException stets vor einem allgemeineren catch-Block platziert werden.

Die Phar-Erweiterung kann je nach Operation sowohl PharException als auch BadMethodCallException oder UnexpectedValueException werfen. Ein vollständiges Error-Handling sollte daher ggf. mehrere Catch-Blöcke vorsehen.