Začínáme
Ošetření chyb
Wire selhává hlasitě a odchytitelně. Každé selhání, které stack vyvolá, je final exception třída z namespace Exceptions/ vlastnícího balíčku, a všechny implementují sdílený marker interface — takže si můžete chytat tak široce nebo tak úzce, jak potřebujete.
Na této stránce
Wire selhává hlasitě a odchytitelně. Každé selhání, které stack vyvolá, je final exception třída
z namespace Exceptions/ vlastnícího balíčku, a všechny implementují sdílený marker interface — takže si
můžete chytat tak široce nebo tak úzce, jak potřebujete.
Chytit celý stack
NyonCode\WireCore\Foundation\Contracts\WireException označuje selhání jako pocházející z wire, ne z PHP,
Laravelu nebo vašeho vlastního kódu:
use NyonCode\WireCore\Foundation\Contracts\WireException; try { $table->getQuery();} catch (WireException $e) { report($e); // wire komponenta je špatně nakonfigurovaná}
Je to marker interface — bez metod — protože jediné, co mají všechna wire selhání společné, je jejich původ.
Chytit jednu konkrétní věc
Každá výjimka je vlastní třída, takže můžete ošetřit přesně ten případ, který vás zajímá:
use NyonCode\WireTable\Exceptions\TableHasNoDataSourceException; try { $table->getQuery();} catch (TableHasNoDataSourceException $e) { // Nebylo nastaveno ani ->model(), ani ->query()}
SPL předek je součást kontraktu
Každá wire výjimka dědí ze SPL třídy, která popisuje, co se reálně pokazilo:
| Předek | Znamená | Příklad |
|---|---|---|
InvalidArgumentException |
předali jste něco neplatného | TableConfigurationException, UnsafeSqlException |
RuntimeException |
objekt je ve stavu, ze kterého nemůže jednat | TableHasNoDataSourceException, ImportException |
Je to záměrné a stabilní: kód, který už chytá SPL třídu, funguje dál. Když wire nahradí generický
throw new RuntimeException(...) doménovou třídou, ta doménová třída dědí z RuntimeException, takže
existující catch (RuntimeException $e) to nijak nezasáhne. Přechod na wire výjimku pro vás nikdy není
breaking change.
Co které balíčky hází
| Balíček | Výjimka | Kdy nastane |
|---|---|---|
wire-core |
UnsafeSqlException |
identifikátor, směr řazení nebo operátor mířící do SQL není prokazatelně bezpečný |
InvalidRelationPathException |
tečkovou cestu (author.company.name) nelze naparsovat |
|
InvalidAggregateException |
agregační funkce, strategie nebo sloupec není platný | |
IconSetRegistrationException |
sada ikon je registrovaná pod rezervovaným nebo nejednoznačným prefixem | |
PluginRegistrationException |
id pluginu je obsazené, nebo závislost není registrovaná | |
ModelNotRegisteredException |
jsou požadována metadata pro neregistrovaný model | |
InvalidChartDataException |
chart widget dostal data nebo options, které neumí vyrenderovat | |
wire-forms |
FormConfigurationException |
formulář nemá model, nebo si jeho form metody protiřečí |
StaleModelException |
optimistic-lock kontrola zjistila, že se záznam mezitím změnil (save lifecycle) | |
wire-table |
TableHasNoDataSourceException |
tabulka je dotazovaná bez model() nebo query() |
TableConfigurationException |
poll interval, cesta v groupBy() nebo typ summary není platný |
|
RelationManagerException |
relation manager je špatně nakonfigurovaný, nebo vztah danou operaci nepodporuje | |
ImportException |
importovanému souboru chybí povinné sloupce, nebo import nemá model/handler |
Výjimky nesou kontext
Tam, kde by handler chtěl víc než jednu větu, nese ho výjimka jako readonly properties, ne jen interpolovaný do zprávy:
} catch (StaleModelException $e) { $e->model; // záznam, který se posunul $e->lockColumn; // sloupec, který to zachytil}
Na co wire výjimku nehází
Wire nevyvolá výjimku kvůli nepřítomné věci tam, kde je nepřítomnost legitimní odpovědí. Komponenta bez přihlášeného uživatele není chyba — prostě není autorizovaná a skryje se. Audit záznam zapsaný z konzolové komandy nemá aktéra a stejně se zapíše.
Jeden případ stojí za zmínku, protože je tichý záměrně: neznámá barva nevyhodí výjimku.
->color('bleu') se vyresolvuje na šedou, místo aby rozbila stránku. Je to vědomý kompromis — překlep
nemá položit view — ale znamená to, že se špatně napsaná barva vyrenderuje potichu. Pokud to chcete
zachytit, Color::tryResolve() vrací pro název, který není barvou, null, a nástroj
validate-wire-component z wire-boostu to nahlásí — spolu s neregistrovanými
ikonami a názvy sloupců, které váš model neumí vyresolvovat.
Související
- Save Lifecycle — kam zapadá
StaleModelException - Autorizace — proč se zamítnutá komponenta skryje místo házení výjimky
- Wire Boost — nástroje, které najdou selhání, jež zůstávají tichá