Re: Probleme mit dem abfangen von Fehlern

From: Martin Schulze (joey@infodrom.org)
Date: Fri May 03 2002 - 22:43:50 CEST


Erik Tews wrote:
> Hallo
>
> Also, wir haben da ein kleines Problem. Es gibt in php kein goto. Also
> wir haben da 2 Möglichkeiten:
>
> 1. Wir packen den Code jeweils in eine Funktion rein. Dann können wir
> ganz einfach fehler("Blub"); return false; machen, und dann sind wir am
> Ende der Datei und der fehlende HTML-Code wird ausgegeben.
>
> 2. Wir müssen wo ne Variable anlegen, wo wir das Seitenende noch mal
> drin speichern. Dann können wir die ausgeben, und dann manen wir exit().
>
> Ich wäre für jeden Fall für Vorschlag 1, das ist der sauberste Weg.

Ich hätte noch folgendes anzubieten:

 . Nach einem potentiellen Fehler wird vor dem Weiterarbeiten eine
   Variable $error geprüft. Es wird nur dann weitergemacht, wenn sie
   nicht den Wert ``true'' beinhaltet.

 . Falls ein (benutzerbedingter) Fehler auftritt, setzen wir diese
   Variable auf ``true'', default beim Programm-/Seitenstart ist
   natürlich ``false''.

 . Zusätzlich definieren wir uns eine Funktion, z.B. error($msg), die
   einen beliebigen Fehlertext ausgibt (falls wir lustig sind, können
   wir den noch in einen gelben Kasten packen o.ä. Wir müssen
   allerdings vor dem Aufruf sicherstellen, daß Tabellen
   o.ä. geschlossen sind, also ggf. echo "</table>" voranstellen.
   Praktischerweise gibt diese Routine ``true'' zurück, so daß wir
   folgendes schreiben können:

   $error = error ("Hier ist ein Fehler passiert...");

Ich stelle mir den Code dann ungefähr so vor:

$error = false;
if ($type == "person")
{
  if (!allowed_to_edit($oldmail)) {
    $error = error ("Sorry, you are not allowed to edit this person");
  }

  if (!$error) {
        
    $name = get_name_from_email($oldmail);
    $query = 'BEGIN TRANSACTION';
    pg_exec($dbh, $query) or die ("Sorry, could not start transaction");
        
    if ($delete == 1) {
      $query = sprintf("DELETE from person where name = '%s'", addslashes($name));
      pg_exec($dbh, $query) or die ("Cannot delete user");
    } else {
      $query = sprintf ("UPDATE person set nightplace = '%s', infomail = %d, insurance = %d, " .
                          "comment = '%s' ", $nightplace, $infomail, $insurance,
                          addslashes($comment));
        
      if ($password == 1)
[..]
   }
} ...

Gruesse,

        Joey

-- 
It's practically impossible to look at a penguin and feel angry.



This archive was generated by hypermail 2.1.3 : Fri May 03 2002 - 22:57:15 CEST