如何捕获此错误:“注意:未定义的偏移量:0”


74

我想捕获此错误:

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

编辑:实际上,我在以下行中收到此错误: $parse = $xml->children[0]->children[0]->toArray();

Answers:


107

您需要定义自定义错误处理程序,例如:

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

3
如果您关闭了错误报告,则此方法将无法正常工作,就像您在生产中一样。
马克·费舍尔

这可能会中断应用程序。设置处理程序后,将在执行代码的所有部分中引发异常。很明显,某些库或代码段会产生非严重警告。
Rehmat

2
@Rehmat没有“非关键警告”之类的东西:如果发出警告-当前代码已被破坏。它可能在大多数时候或此刻偶然工作,但不能保证。
zerkms

我认为最好将其set_error_handler(...)放置在function exceptions_error_handler...tnx之后
起亚纳西扎德

24

您不能使用try / catch块,因为这是一个错误,而不是例外。

在使用偏移之前,请务必尝试:

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

18
1.这不是错误,而是通知。2.我们可以将通知/警告/错误转换为异常
zerkms 2011年

在PHP中,此通知必须有多种解决方案,是否有最佳实践?就我个人而言,我经常使用empty()而不是isset()因为它的比较有所不同:php.net/manual/en/types.comparisons.php
Abraham Brookes

11

我知道这是2016年,但万一有人发现该职位。

您可以使用该array_key_exists($index, $array)方法以避免发生异常。

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

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

9
$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;

10
我要指出它的效率极其低下的创建例外,所以您可以抓住它,并立即使用它,尤其是当它更容易只是把那个echoelse的条款。这不会减损您的回答,但我认为需要指出。
paxdiablo 2011年

3
没错,我不喜欢写它,但足以满足他最初的问题!
囚犯

我很想知道拒绝投票的理由,老兄。在我看来,这完全可以。
paxdiablo 2011年

尽管可能非常高效,但很快有必要使代码行为与PHP 7保持一致。PHP7几乎完全抛出异常。
Michael Morris

2
如果它确实是一个例外,那是适当的;如果从未期望过发生,那么效率并不重要。
2016年

0

通常,您无法使用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>:"

注意:该函数将捕获包含以下内容的无害输出:

<b>通知</ b>:

但是,为了摆脱这个问题,只需将其更改为:

<b>注意:</ b>


-6

我确定为什么会抛出错误,但我修复了一些..

在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)要修复的循环。但我解决了我的问题,您没有其他错误。

所以我希望对你有用.. !!! 击败护卫队

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.