2012-03-27 7 views
1

Ich weiß, dass diese Frage vor numorous mal gefragt wurde, aber sie scheinen eine Desktop-Anwendung Hintergrund und nicht Web-Anwendung zu haben. Ich baue gerade eine Webanwendung mit PHP. Ich werde einen Controller und eine Modelldatei verwenden, um meine Frage zu demonstrieren.Die beste Praxis, wenn PHP Ausnahmebehandlung verwenden

Controller-Datei

Diese Datei auf der Datenbank Datenanrufe abzufragen und holen

<?php public function index() { 
    $this->database->query("SELECT user_name, FROM test WHERE user_name = :user_name"); 
    $this->database->execute_query("jim"); 
    $this->view->data = $this->database->fetch_query(); 
?> 

Die Datenbankdatei

<?php 

class DB { 

    private $datasourcename; 
    private $user; 
    private $password; 
    private $connection; 
    private $prepare; 
    private $query; 

    function __construct($dsn, $user, $password) { 

     $this->datasourcename = $dsn; 
     $this->user = $user; 
     $this->password = $password;  

     $this->connection = new PDO($this->datasourcename, $this->user, $this->password); 
    } 

    public function query($query) { 

     $this->query = $query; 
     try { 
      if (empty($query)) { 

       throw new Exception("The query is empty"); 
       return false; 
      } 
     } catch (Exception $e) { 
      echo 'Caught exception: ', $e->getMessage(), "<br/>"; 
     } 
     if (strstr($query, ":") == FALSE) { 
      return $this->connection->query($query); 
     } else { 

      $this->prepare = $this->connection->prepare($query); 
     } 
    } 

    public function execute_query($valarg = array()) { 

     try { 
      if (empty($valarg)) { 

       throw new Exception("There are no values in the execute query function"); 
       return false; 
      } 
      if (is_array($valarg) == false) { 

       throw new Exception("The values inserted are not in an array"); 
       return false; 
      } else { 

       $query = $this->query; 
       $paramkeys = array(); 
       $paramArr = array(); 

       if (strstr($query, ":")) {  

        preg_match_all("/:(\w+)/", $query, $paramkeys); 

        $paramArr = array_combine($paramkeys[0], $valarg); 

        $this->prepare->execute($paramArr); 
       } 
      } 
     } catch (Exception $e) { 
      echo 'Caught exception: ', $e->getMessage(), "<br/>"; 
     } 
    } 

    public function fetch_query() { 

     try { 
      if($this->execute_query() == false) { 

       throw new Exception("Sorry you need to fix this first"); 
      } 

      if($this->query() == false) { 

       throw new Exception("Sorry you need to fix this first"); 
      } 
      else { 

       $result = $this->prepare->fetch(PDO::FETCH_ASSOC); 

       return $result; 
      } 
     } 
     catch (Exception $e) { 
      echo 'Caught exception: ', $e->getMessage(), "<br/>"; 
     } 
    } 
} 

?> 

ich in meiner Datenbank Klasse Ausnahmebehandlung als eine Möglichkeit genutzt haben Damit ein Entwickler die von dieser Klasse bereitgestellten Funktionen korrekt verwendet, damit die Anwendung funktioniert, habe ich recht, wenn ich daran denke, dass dies die beste Vorgehensweise ist, um sie zu verwenden? Gibt es eine klare Best Practice, wann und wie man sie benutzt? Ich habe ähnliche Fragen auf dieser Website gelesen, aber der Hintergrund war Desktop-Anwendungsdesign und keine Webanwendung.

Antwort

6

Web-Programmierung ist nicht anders als Desktop-Programmierung in dieser Hinsicht.

Verwenden Sie Ausnahmen für Ausnahme Ereignisse. Verwenden Sie Rückgabewerte für alles, was erwartet wird.

Ich denke, ein leeres Abfrageergebnis zu sehen, ist nicht etwas, das eine Ausnahme ausgelöst wird, im Allgemeinen. Ich würde nur keine Daten zurückgeben. Wenn die Datenbankabfrage irgendwie fehlgeschlagen ist, wäre das ein Grund, eine Ausnahme auszulösen. Außerdem sollten Ihre Ausnahmemeldungen möglicherweise aussagekräftiger sein als "Sie müssen dies beheben".

Schließlich können Sie in PHP 5.3 eine innere Ausnahme festlegen, indem Sie sie als dritten Parameter im Exception-Konstruktor übergeben.

http://www.php.net/manual/en/class.exception.php

+0

Eine leere Abfrage ist in diesem Zusammenhang ** ** absolut eine Ausnahme. Es gibt keinen triftigen Grund, jemals versucht zu haben, das Nichts abzufragen, was bedeutet, dass der aufrufende Code in irgendeiner Weise gebrochen ist. Wenn man hier keine Ausnahme macht, würde das Wasser nur trüben, wenn man versucht, die Ursache des Fehlers herauszufinden. – FtDRbwLXw6

+0

@drrcknlsn, ich habe allgemein gesprochen. Wenn die Anwendung erwartet und erfordert, dass ein Ergebnis fortgesetzt wird, dann ist eine Ausnahme durchaus sinnvoll. – Brad

+0

Auch wenn ein Ergebnis nicht fortgesetzt werden muss, ist eine leere Abfrage ein Zeichen, dass etwas nicht stimmt. Die Rückgabe von nichts würde es dem aufrufenden Code erlauben, das Problem nicht zu bemerken, wenn es keinen Rückgabewert erwartet (z.B. sollte es eine Befehlsabfrage gewesen sein). – FtDRbwLXw6

Verwandte Themen