Frage

Ich bin mit einigen der Grundlagen vertraut, aber was würde Ich mag mehr über ist, wann und warum Fehlerbehandlung (einschließlich werfen Ausnahmen) sollte in PHP verwendet wird, vor allem auf einer Live-Website oder Web-App. Ist es etwas, das überstrapaziert werden kann, und wenn ja, was übermäßigen Gebrauch macht aussehen? Gibt es Fälle, in denen es nicht verwendet werden sollte? Auch, was sind einige der häufigsten Sicherheitsbedenken in Bezug Umgang mit dem Irrtum?

War es hilfreich?

Lösung

Eine Sache hinzufügen, was gesagt wurde bereits ist, dass es von größter Bedeutung ist, dass Sie Fehler in Ihrer Web-Anwendung in ein Protokoll aufzunehmen. Auf diese Weise, wie Jeff „Coding Horror“ Atwood schon sagt, werden Sie wissen, wenn Ihre Benutzer Probleme mit der App erleben (statt „um sie zu fragen, was los ist“).

Um dies zu tun, empfehle ich die folgende Art von Infrastruktur:

  • Erstellen Sie eine „Crash“ Tabelle in Ihrer Datenbank und eine Reihe von Wrapper-Klassen für Fehler berichten. Ich würde empfehlen, Kategorien für die Abstürze ( „Blocking“, „Sicherheit“, „PHP-Fehler / Warnung“ (vs Ausnahme), etc.) einstellen.
  • In allen Ihren Fehlerbehandlungscode, stellen Sie sicher, um den Fehler zu erfassen. Dadurch hängt konsequent ab, wie gut Sie die API gebaut (siehe oben Schritt) - es sollte trivial Abstürze aufzeichnen, wenn es richtig gemacht.

Zusatzkredit: manchmal wird Ihre Abstürze auf Datenbankebene Abstürze sein: dh DB-Server nach unten, etc. Wenn das der Fall ist, Ihre Fehlerprotokollierung Infrastruktur (oben) wird fehlschlagen (Sie nicht den Absturz der DB anmelden kann, weil das Protokoll versucht, die DB) zu schreiben. In diesem Fall würde ich Failover-Logik in Ihrer Crash-Wrapper-Klasse schreiben, um entweder

  • Geben Sie eine E-Mail an den Administrator senden, UND / ODER
  • notieren Sie die Details des Absturzes zu einer Textdatei

All dies klingt wie ein viel des Guten, aber glauben Sie mir, das macht einen Unterschied, ob Ihre Anwendung als „stabil“ akzeptiert oder „flockig“. Dieser Unterschied resultiert aus der Tatsache, dass alle Anwendungen wie flockig / Absturz der ganzen Zeit starten, aber die Entwickler, die über alle Probleme mit ihrem App wissen, haben eine Chance, es tatsächlich zu beheben.

Andere Tipps

Grob gesagt, Fehler sind ein Vermächtnis in PHP, während Ausnahmen die moderne Art und Weise sind Fehler zu behandeln. Die einfachste Sache ist also eine Fehlerbehandlungsroutine einzurichten, die eine Ausnahme auslöst. Auf diese Weise werden alle Fehler zu Ausnahmen umgewandelt, und dann können Sie einfach mit einem Fehlerbehandlungsschema beschäftigen. Der folgende Code konvertiert Fehler Ausnahmen für Sie:

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);
  }
}
set_error_handler('exceptions_error_handler');
error_reporting(E_ALL ^ E_STRICT);

Es gibt einige Fälle, obwohl, wo Code speziell mit Fehlern arbeiten soll. Zum Beispiel stellt sich die schemaValidate Methode von DomDocument Warnungen, wenn ein Dokument die Validierung . Wenn Sie Fehler zu Ausnahmen konvertieren, wird es nach dem ersten Fehler Validierung zu stoppen. Einige Male das ist, was Sie wollen, aber wenn ein Dokument die Validierung, möchten Sie vielleicht tatsächlich alle Ausfälle. In diesem Fall können Sie vorübergehend einen Fehlerhandler installieren, die die Fehler sammeln. Hier ist ein kleiner Ausschnitt, ich habe für diesen Zweck verwendet:

class errorhandler_LoggingCaller {
  protected $errors = array();
  function call($callback, $arguments = array()) {
    set_error_handler(array($this, "onError"));
    $orig_error_reporting = error_reporting(E_ALL);
    try {
      $result = call_user_func_array($callback, $arguments);
    } catch (Exception $ex) {
      restore_error_handler();
      error_reporting($orig_error_reporting);
      throw $ex;
    }
    restore_error_handler();
    error_reporting($orig_error_reporting);
    return $result;
  }
  function onError($severity, $message, $file = null, $line = null) {
    $this->errors[] = $message;
  }
  function getErrors() {
    return $this->errors;
  }
  function hasErrors() {
    return count($this->errors) > 0;
  }
}

Und ein Anwendungsfall:

$doc = new DomDocument();
$doc->load($xml_filename);
$validation = new errorhandler_LoggingCaller();
$validation->call(
  array($doc, 'schemaValidate'),
  array($xsd_filename));
if ($validation->hasErrors()) {
  var_dump($validation->getErrors());
}

unhanded Fehler stoppen Sie das Skript, das allein ein ziemlich guter Grund ist, sie zu behandeln.

Im Allgemeinen können Sie einen Try-Catch-Block verwenden, um mit Fehlern umgehen

try
{
    // Code that may error
}
catch (Exception $e)
{
    // Do other stuff if there's an error
}

Wenn Sie die Fehler- oder Warnmeldung stoppen auf der Seite erscheint, dann können Sie den Anruf mit einem Präfix @ -Zeichen wie so.

 @mysql_query($query);

Bei Anfragen aber es ist generell eine gute Idee, so etwas wie diese so haben Sie eine bessere Vorstellung von dem zu tun, was los ist.

@mysql_query($query)
    or die('Invalid query: ' . mysql_error() . '<br />Line: ' . __LINE__ . '<br />File: ' . __FILE__ . '<br /><br />');

Sie sollten verwenden Fehler bei der Bearbeitung von Fällen, wo Sie explizite Kontrolle nicht über die Daten haben das Skript gerade arbeitet. Ich neige dazu, es zum Beispiel an Orten wie Formularvalidierung häufig zu verwenden. Zu wissen, wie fehleranfällig Stellen im Code zu erkennen, erfordert einige Übung: Einige häufigsten ist nach Funktionsaufrufen, die einen Wert zurückgeben, oder wenn mit den Ergebnissen aus einer Datenbankabfrage zu tun. Sie sollten niemals die Rückkehr aus einer Funktion übernehmen wird, was Ihr erwartet, und Sie sollten in der Erwartung codieren sicher sein. Sie müssen nicht try / catch-Blöcke verwenden, obwohl sie nützlich sind. Eine Menge Zeit, können Sie mit einer einfachen if / else Check auszukommen.

Fehlerbehandlung geht Hand in Hand mit sicheren Codierungsverfahren, da es eine Menge von „Fehlern“, die Ihr Skript nicht dazu führen, einfach zum Absturz bringen. während nicht streng über Fehler war per se Handhabung, hat addedbytes eine gute 4 Artikelserie über einige der Grundlagen der sicheren PHP-Programmierung, die Sie HIER . Es gibt eine Menge anderer Fragen hier auf Stackoverflow zu Themen wie mysql_real_escape_string und Reguläre Ausdrücke denen sehr leistungsfähig sein können bei der Bestätigung der Inhalt Benutzer eingegebenen Daten.

Die beste Praxis IMHO ist folgende Vorgehensweise zu verwenden: 1. Erstellen eines Fehler / Exception-Handler 2. es starten auf die App starten 3. behandeln alle Ihre Fehler von innen dort

<?php

Klasse Debug {

    public static setAsErrorHandler() {
         set_error_handler(array(__CLASS__, '__error_handler'));
    }

public static function __error_handler($errcode, $errmsg, $errfile, $errline) {
       if (IN DEV) {
                print on screen
           }
           else if (IN PRO) {
                log and mail
           } 
    }

}

Debug :: setAsErrorHandler ();

?>

Anstatt die mysql_error outputing könnte speichern Sie es in einem Protokoll. auf diese Weise können Sie den Fehler verfolgen (und Sie hängen nicht von den Benutzern darüber zu berichten), und Sie können in und entfernen Sie das Problem gehen.

Die beste Fehlerbehandlung ist die Art, die für den Benutzer transparent ist, lassen Sie Ihren Code aussortieren das Problem, keine Notwendigkeit, dass Benutzer Kollegen einzubeziehen.

neben Fehlern sofort im Code Umgang können Sie auch Gebrauch machen

http://us.php.net/manual /en/function.set-exception-handler.php
und
http://us.php.net/manual/en/ function.set-error-handler.php

Ich finde Ihre eigenen Exception-Handler besonders nützlich Einstellung. Wenn eine Ausnahme auftritt, können Sie verschiedene Operationen durchführen, je nachdem, welche Art von Ausnahme ist.

ex: Wenn ein mysql_connet Aufruf zurückkehrt FALSE werfe ich ein new DBConnectionException(mysql_error()) und handhabe es eine „besondere“ Art und Weise: Das Fehlerprotokoll, die DB-Verbindung info (Host, Benutzername, Passwort) usw. und vielleicht sogar das Dev-Teams per E-Mail benachrichtigt, dass etwas kann wirklich falsch mit der DB

Ich benutze diese Standard-Fehlerbehandlung zu ergänzen. ich würde empfehlen, diesen Ansatz überbeanspruchend

Fehlerunterdrückung bei @ ist sehr langsam.

Sie können auch Google Forms verwenden, um Ausnahmen zu fangen und zu analysieren, ohne eine Datenbank oder öffentlich zugängliche Server vorhalten zu müssen. Es gibt ein Tutorial hier , dass der Prozess erklärt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top