So fangen Sie diesen Fehler ab: "Hinweis: Undefinierter Offset: 0"

73

Ich möchte diesen Fehler abfangen:

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

Bearbeiten: Tatsächlich habe ich diesen Fehler in der folgenden Zeile erhalten: $parse = $xml->children[0]->children[0]->toArray();

Meotimdihia
quelle

Antworten:

107

Sie müssen Ihren benutzerdefinierten Fehlerbehandler wie folgt definieren:

<?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";
}
zerkms
quelle
3
Dies funktioniert nicht, wenn Sie die Fehlerberichterstattung deaktiviert haben, wie Sie es wahrscheinlich in der Produktion tun würden.
Mark Fisher
Dies kann eine Anwendung beschädigen. Ausnahmen werden in allen Teilen des Codes ausgelöst, die ausgeführt werden, nachdem der Handler festgelegt wurde. Und es ist offensichtlich, dass bestimmte Bibliotheken oder Code-Teile unkritische Warnungen erzeugen.
Rehmat
1
@Rehmat gibt es keine "unkritische Warnung": Wenn eine Warnung ausgegeben wird, ist der aktuelle Code bereits fehlerhaft. Es kann die meiste Zeit oder in diesem Moment versehentlich funktionieren, aber es kann nicht garantiert werden.
Zerkms
Ich denke, es ist besser, dass set_error_handler(...)nach function exceptions_error_handler..., tnx
kia nasirzadeh
23

Sie können nicht mit einem Try / Catch-Block, da dies ein Fehler ist, keine Ausnahme.

Versucht immer Offsets, bevor Sie sie verwenden:

if( isset( $a[ 0 ] ) { $b = $a[ 0 ]; }
Macmade
quelle
18
1. Es ist kein Fehler, sondern ein Hinweis 2. Wir können Hinweise / Warnungen / Fehler in Ausnahmen
umwandeln
Es muss eine Reihe von Lösungen für diesen Hinweis in PHP geben. Gibt es eine bewährte Methode? Persönlich verwende ich oft empty()statt, isset()weil es ein wenig anders vergleicht: php.net/manual/en/types.comparisons.php
Abraham Brookes
10

Ich weiß, es ist 2016, aber falls jemand zu diesem Beitrag kommt.

Sie können die array_key_exists($index, $array)Methode verwenden, um zu vermeiden, dass eine Ausnahme auftritt.

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

if(!array_key_exists($index, $array))
{
    //Throw myCustomException;
}
ggderas
quelle
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();
}

Oder ohne die Ineffizienz, eine sehr vorübergehende Ausnahme zu erstellen:

$a[1] = 'jfksjfks';
$offset = 0;
if(isset($a[$offset]))
  $b = $a[$offset];
else
  echo "Notice: Undefined offset: ".$offset;
Häftling
quelle
10
Ich sollte erwähnen, dass es schrecklich ineffizient ist, eine Ausnahme zu erstellen, damit Sie sie abfangen und sofort verwenden können, insbesondere wenn es einfacher ist, sie einfach echoin die elseKlausel aufzunehmen. Das beeinträchtigt Ihre Antwort nicht, aber ich dachte, es muss darauf hingewiesen werden.
Paxdiablo
3
Das ist sehr wahr, ich habe es nicht genossen, es zu schreiben, aber es genügt seiner ursprünglichen Frage!
Gefangener
Ich wäre daran interessiert, die Gründe für die Ablehnung zu kennen, bods. Das scheint mir vollkommen in Ordnung zu sein.
Paxdiablo
So schrecklich effizient es auch sein mag, es wird bald notwendig sein, das Codeverhalten mit PHP 7 kongruent zu halten. PHP 7 löst fast ausschließlich Ausnahmen aus.
Michael Morris
2
Es ist angemessen, wenn es wirklich eine Ausnahme ist. Effizienz spielt keine Rolle, wenn dies niemals erwartet wird.
Chim
0

Normalerweise können Sie mit dem Try-Catch-Block keine Benachrichtigungen abfangen. Sie können jedoch Hinweise in Ausnahmen umwandeln! Verwenden Sie diesen Weg:

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

Mit dieser Funktion können Sie auch Warnungen abfangen. Ändern Sie einfach den Funktionsnamen in get_warning und ändern Sie "<b>Notice</b>:"in "<b>Warning</b>:".

Hinweis: Die Funktion fängt eine unschuldige Ausgabe ab, die Folgendes enthält:

<b> Hinweis </ b>:

Um diesem Problem zu entkommen, ändern Sie es einfach in:

<b> Hinweis: </ b>

MAChitgarha
quelle
-6

Ich bin sicher, warum der Fehler werfen, aber ich behebe einige ..

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

GLEICH In Zeile 2138:

//FIX:

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

Das Problem, dass das Array $ sw keinen Schlüssel von $ corr [$ y] [$ x] [2] hat, also behebe ich die Schleife, um die maximale Anzahl ($ sw) zu beheben. Ich weiß nicht, ob dies eine weitere Folge erzeugt aber ich löse mein Problem und habe keine Fehler mehr ..

Also ich hoffe es funktioniert für dich .. !!! Beats Reguards

Carlos
quelle