Felkontroll: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Rad 19: Rad 19:
$my_file = @file('non_existent_file') eller
$my_file = @file('non_existent_file') eller
     die("Kunde inte öppna filen: felet var '" . error_get_last()['message'] . "'");
     die("Kunde inte öppna filen: felet var '" . error_get_last()['message'] . "'");
// detta fungerar för vilket uttryck som helst, inte bara funktioner:
// detta fungerar för vilket uttryck som helst, inte bara funktioner:
$value = @$cache[$key];
$value = @$cache[$key];

Versionen från 17 augusti 2024 kl. 12.13

Felkontrolloperatorer

PHP stöder en felkontrolloperator: at-tecknet (@). När det läggs till framför ett uttryck i PHP kommer alla diagnostiska fel som kan genereras av det uttrycket att undertryckas.

Om en anpassad felhanterarfunktion är inställd med `set_error_handler()`, kommer den fortfarande att anropas även om diagnostiken har undertryckts.

Varning Före PHP 8.0.0 returnerade `error_reporting()` alltid 0 om felet undertrycktes av @-operatorn, när det anropades inuti den anpassade felhanteraren.

Från och med PHP 8.0.0 returnerar det värdet av detta (bitvisa) uttryck: `E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE`.

Eventuella felmeddelanden som genereras av uttrycket är tillgängliga i "message"-elementet i arrayen som returneras av `error_get_last()`. Resultatet av den funktionen kommer att ändras vid varje fel, så det måste kontrolleras tidigt.

<?php

/* Avsiktligt filfel */

$my_file = @file('non_existent_file') eller

   die("Kunde inte öppna filen: felet var '" . error_get_last()['message'] . "'");

// detta fungerar för vilket uttryck som helst, inte bara funktioner: $value = @$cache[$key]; // kommer inte att generera en notis om indexet $key inte existerar.

?>

Notering: @-operatorn fungerar endast på uttryck. En enkel tumregel är: om man kan ta värdet av något, då kan man lägga till @-operatorn framför det. Till exempel kan det läggas till framför variabler, funktionsanrop, vissa språkkonstruktanrop (t.ex. `include`) och så vidare. Det kan inte läggas till framför funktions- eller klassdefinitioner, eller konditionella strukturer som `if` och `foreach`, och så vidare.

Varning

Före PHP 8.0.0 var det möjligt för @-operatorn att inaktivera kritiska fel som skulle avsluta skriptkörningen. Till exempel, att lägga till @ framför ett anrop till en funktion som inte existerade, genom att den var otillgänglig eller felskriven, skulle få skriptet att avslutas utan någon indikation om varför.

Se även