Как отловить эту ошибку: «Примечание: неопределенное смещение: 0» - PullRequest
64 голосов
/ 21 марта 2011

Я хочу уловить эту ошибку:

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

Редактировать: фактически, я получил эту ошибку в следующей строке: $parse = $xml->children[0]->children[0]->toArray();

Ответы [ 6 ]

96 голосов
/ 21 марта 2011

Вам необходимо определить свой собственный обработчик ошибок, например:

<?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";
}
22 голосов
/ 21 марта 2011

Вы не можете использовать блок try / catch, так как это ошибка, а не исключение.

Всегда пробует смещения перед их использованием:

if( isset( $a[ 0 ] ) { $b = $a[ 0 ]; }
9 голосов
/ 01 марта 2016

Я знаю, что сейчас 2016, но на тот случай, если кто-то попадет на этот пост.

Вы можете использовать метод array_key_exists($index, $array), чтобы избежать возникновения исключения.

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

if(!array_key_exists($index, $array))
{
    //Throw myCustomException;
}
9 голосов
/ 21 марта 2011
$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();
}

Или без неэффективности создания очень временного исключения:

$a[1] = 'jfksjfks';
$offset = 0;
if(isset($a[$offset]))
  $b = $a[$offset];
else
  echo "Notice: Undefined offset: ".$offset;
0 голосов
/ 25 июня 2017

Обычно вы не можете ловить уведомления с помощью блока try-catch. Но вы можете конвертировать уведомления в исключения! Используйте этот способ:

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)!
}

Кроме того, вы можете использовать эту функцию для перехвата предупреждений. Просто измените имя функции на get_warning и измените "<b>Notice</b>:" на "<b>Warning</b>:".

Примечание: Функция перехватит невинный вывод, который содержит:

Примечание

Но чтобы избежать этой проблемы, просто измените ее на:

Примечание:

0 голосов
/ 13 июля 2016

Я уверен, почему выдается ошибка, но я исправляю некоторые ..

в html2pdf.class.php

в строках 2132:

//FIX:
$ctop=$corr[$y][$x][2]<=count($sw)?$corr[$y][$x][2]:count($sw);
$s = 0; for ($i=0; $i<$ctop; $i++) {$s+= array_key_exists($x+$i, $sw)? $sw[$x+$i]:0;}

ТОЛЬКО В строке 2138:

//FIX:

$ctop=$corr[$y][$x][2]<=count($sw)?$corr[$y][$x][2]:count($sw);
 for ($i=0; $i<$ctop; $i++) {

проблема, у массива $ sw нет ключа $ corr [$ y] [$ x] [2], поэтому я исправляю цикл, чтобы исправить максимальное число ($ sw).Я не знаю, если это создает другое последствие, но я решаю свою проблему, у меня больше нет ошибок ..

Так что я надеюсь, что сработает с вами .. !!!Beats Reguards

...