How to catch this error: "Notice: Undefined offset: 0"

PhpError HandlingTry Catch

Php Problem Overview


I want to catch this error:

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

Edit: in fact, I got this error on the following line: $parse = $xml->children[0]->children[0]->toArray();

Php Solutions


Solution 1 - Php

You need to define your custom error handler like:

<?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";
}

Solution 2 - Php

You can't with a try/catch block, as this is an error, not an exception.

Always tries offsets before using them:

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

Solution 3 - Php

I know it's 2016 but in case someone gets to this post.

You could use the array_key_exists($index, $array) method in order to avoid the exception to happen.

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

if(!array_key_exists($index, $array))
{
	//Throw myCustomException;
}


Solution 4 - Php

$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();
}

Or, without the inefficiency of creating a very temporary exception:

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

Solution 5 - Php

Important: Prefer not using this method, use others. While it works, it is ugly and has its own pitfalls, like falling into the trap of converting real and meaningful output into exceptions.

Normally, you can't catch notices with a simple try-catch block. But there's a hacky and ugly way to do it:

function convert_notice_to_exception($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();

    convert_notice_to_exception($codeOutput);
} catch (\Exception $exception) {

}

Also, you can use this function for to catch warnings. Just change function name to convert_warning_to_exception and change "<b>Notice</b>:" to "<b>Warning</b>:".

Note: The function will catch normal output that contains:

<b>Notice</b>:

To escape from this problem, simply, change it to:

<b>Notice:</b>

Solution 6 - Php

For the people who are getting the error

PHP Notice: unserialize(): Error at offset 191 of 285 bytes in ...

and are getting the data from a database, Make sure that you have the database set the the correct encoding, I had the database set as latin1_swedish_ci and all of the data looked perfect, Infact when i copied it into a online unserialize it worked fine. I changed the collation to utf8mb4_unicode_ci and all worked fine.

Source User Contributed Notes: https://www.php.net/manual/pt_BR/function.unserialize.php

I tried to utf8_decode before unserialize, and it's works fine.

Piece of code where I applied utf8_decode()

Solution 7 - Php

Im sure why the Error Throw but i fix some..

in html2pdf.class.php

on Lines 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;}
 

SAME On line 2138:

//FIX:

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

the problem the array $sw not have a key of $corr[$y][$x][2] so i fix the loop for to max count($sw) to fix .. I dont know if that create an another consecuense but i resolve my problem y dont have any more errors..

So i hope works to you ..!!! Beats Reguards

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmeotimdihiaView Question on Stackoverflow
Solution 1 - PhpzerkmsView Answer on Stackoverflow
Solution 2 - PhpMacmadeView Answer on Stackoverflow
Solution 3 - PhpLuis DerasView Answer on Stackoverflow
Solution 4 - PhpPrisonerView Answer on Stackoverflow
Solution 5 - PhpMAChitgarhaView Answer on Stackoverflow
Solution 6 - PhpCaique AndradeView Answer on Stackoverflow
Solution 7 - PhpcarlosView Answer on Stackoverflow