web-dev-qa-db-fra.com

Comment attraper cette erreur: "Remarque: décalage non défini: 0"

Je veux attraper cette erreur:

$a[1] = 'jfksjfks';
try {
      $b = $a[0];
} catch (\Exception $e) {
      echo "jsdlkjflsjfkjl";
}

Edit: en fait, j'ai eu cette erreur sur la ligne suivante: $parse = $xml->children[0]->children[0]->toArray();

60
meotimdihia

Vous devez définir votre gestionnaire d’erreurs personnalisé comme suit:

<?php

set_error_handler('exceptions_error_handler');

function exceptions_error_handler($severity, $message, $filename, $lineno) {
  if (error_reporting() == 0) {
    return;
  }
  if (error_reporting() & $severity) {
    throw new ErrorException($message, 0, $severity, $filename, $lineno);
  }
}

$a[1] = 'jfksjfks';
try {
      $b = $a[0];
} catch (Exception $e) {
      echo "jsdlkjflsjfkjl";
}
91
zerkms

Vous ne pouvez pas utiliser un bloc try/catch, car il s'agit d'une erreur et non d'une exception.

Toujours essayer les décalages avant de les utiliser:

if( isset( $a[ 0 ] ) { $b = $a[ 0 ]; }
22
Macmade

Je sais que nous sommes en 2016, mais au cas où quelqu'un arriverait à ce poste.

Vous pouvez utiliser la méthode array_key_exists($index, $array) afin d'éviter que l'exception ne se produise.

$index = 99999;
$array = [1,2,3,4,5,6];

if(!array_key_exists($index, $array))
{
    //Throw myCustomException;
}
9
ggderas
$a[1] = 'jfksjfks';
try {
  $offset = 0;
  if(isset($a[$offset]))
    $b = $a[$offset];
  else
    throw new Exception("Notice: Undefined offset: ".$offset);
} catch (Exception $e) {
  echo $e->getMessage();
}

Ou, sans l'inefficacité de créer une exception très temporaire:

$a[1] = 'jfksjfks';
$offset = 0;
if(isset($a[$offset]))
  $b = $a[$offset];
else
  echo "Notice: Undefined offset: ".$offset;
9
Prisoner

Normalement, vous ne pouvez pas intercepter les notifications avec le bloc try-catch. Mais vous pouvez convertir les avis en exceptions! Utilisez cette manière:

function get_notice($output)
{
    if (($noticeStartPoint = strpos($output, "<b>Notice</b>:")) !== false) {
        $position = $noticeStartPoint;
        for ($i = 0; $i < 3; $i++)
            $position = strpos($output, "</b>", $position) + 1;
        $noticeEndPoint = $position;
        $noticeLength = $noticeEndPoint + 3 - $noticeStartPoint;
        $noticeMessage = substr($output, $noticeStartPoint, $noticeLength);
        throw new \Exception($noticeMessage);
    } else
        echo $output;
}

try {
    ob_start();
    // Codes here
    $codeOutput = ob_get_clean();
    get_notice($codeOutput);
} catch (\Exception $exception) {
    // Catch (notice also)!
}

Vous pouvez également utiliser cette fonction pour intercepter des avertissements. Changez simplement le nom de la fonction en get_warning et changez "<b>Notice</b>:" en "<b>Warning</b>:".

Remarque: La fonction interceptera une sortie innocente contenant:

<b> Remarque </ b>:

Mais pour échapper à ce problème, changez-le simplement en:

<b> Remarque: </ b>

0
MAChitgarha