Eccezioni di TrueAsync Server
(PHP 8.6+, true_async_server 0.1+)
Gerarchia
\Exception
└── TrueAsync\HttpServerException // base
├── TrueAsync\HttpServerRuntimeException // final
├── TrueAsync\HttpServerInvalidArgumentException // final
├── TrueAsync\HttpServerConnectionException // final
├── TrueAsync\HttpServerProtocolException // final
└── TrueAsync\HttpServerTimeoutException // final
\Async\AsyncCancellation
└── TrueAsync\HttpException // NON final — ereditata per eccezioni di dominioTrueAsync\HttpServerException
namespace TrueAsync;
class HttpServerException extends \Exception {}Eccezione base per tutti gli errori del server. Catch-all per la gestione errori quando il dominio dell'errore non importa.
TrueAsync\HttpServerRuntimeException
final class HttpServerRuntimeException extends HttpServerException {}Errori a runtime durante il funzionamento del server. Origini tipiche:
- Tentativo di modificare la configurazione dopo
new HttpServer($config)($config->setXxx()dopo il lock). - Tentativo di modificare uno
StaticHandlerdopo l'attach ($static->setXxx()dopoaddStaticHandler()). - Qualunque tentativo di modificare un
HttpResponsedoposendFile()(risposta sigillata). end()-dopo-end(),write()doposendFile()e analoghe violazioni del lifecycle.
TrueAsync\HttpServerInvalidArgumentException
final class HttpServerInvalidArgumentException extends HttpServerException {}Argomento non valido. Lanciata dai setter di HttpServerConfig/StaticHandler/UploadedFile quando un valore esce dal range valido (es. setBrotliLevel(99), setMaxBodySize(0), content-coding sconosciuto in enablePrecompressed()).
TrueAsync\HttpServerConnectionException
final class HttpServerConnectionException extends HttpServerException {}Errori a livello di socket e rete: bind fallito, listener non avviato, peer reset sul critical-path del protocollo.
TrueAsync\HttpServerProtocolException
final class HttpServerProtocolException extends HttpServerException {}Errori a livello di protocollo: HTTP malformato, header non validi, violazioni del protocollo non recuperabili.
TrueAsync\HttpServerTimeoutException
final class HttpServerTimeoutException extends HttpServerException {}Timeout: lettura, scrittura, keep-alive, graceful shutdown.
TrueAsync\HttpException
namespace TrueAsync;
class HttpException extends \Async\AsyncCancellation {}Classe speciale: non eredita da HttpServerException ma da Async\AsyncCancellation. Da usare per inviare una risposta HTTP specifica da qualsiasi punto dell'handler — il server legge:
$code: stato HTTP (deve essere 4xx/5xx, altrimenti 500);$message: corpo della risposta.
Viene anche lanciata internamente quando il parser raggiunge un limite dopo che l'handler è già stato dispatchato: il server cancella l'handler con HttpException, e la cancellation passa per la normale catena Async pur portando lo stato HTTP esatto per il peer.
Non final: ereditala per dominio:
use TrueAsync\HttpException;
class NotFoundException extends HttpException {}
class ForbiddenException extends HttpException {}
class PayloadTooLargeException extends HttpException {}
$server->addHttpHandler(function ($req, $res) {
$user = User::find($req->getQueryParam('id'))
?? throw new NotFoundException('user not found', 404);
if (!$user->canBeViewedBy(currentUser()))
throw new ForbiddenException('access denied', 403);
$res->json($user->toArray());
});Firewall di bailout
Qualsiasi altra eccezione dall'handler (E_ERROR, OOM, \Throwable non gestiti) non abbatte il server. Sul confine H1/H2/H3 di ingresso della richiesta c'è un firewall di bailout che:
- Drena la coroutine fallita.
- Invia 500 al client (se gli header non sono ancora sulla rete).
- Restituisce il controllo al listener, che continua ad accettare.
Il comportamento è unico per HTTP/1.1, stream HTTP/2 e stream HTTP/3.