Frage

ich dies für eine lange Zeit (auch hier) gesucht, haben viele PHP-Codes lesen, aber immer noch keine befriedigende Antwort finden konnte. Es kann ein zu breites Thema erscheinen, aber es klebt wirklich zusammen - endlich für mich. Könnten Sie bitte helfen?

In einer PHP-Website Ich habe PDO als DAL, was von BLL Objekten verwendet wird, und sie werden von der Benutzeroberfläche genannt. Nun, wenn etwas geschieht, wirft PDO eine PDOException. Natürlich ist die UI-Ebene hat nichts über PDOExceptions wissen, so dass es das BLL Objekt fängt. Aber was nun?

Ich habe gelesen, dass

  1. Ausnahmen sind für wirklich außergewöhnliche Situationen und
  2. ein Wieder löst Ausnahmen aus unteren Schichten, um Low-Level-Ausnahmen in der oberen Schichten nicht zu erhalten.

Lassen Sie mich mein Problem veranschaulichen (beachten Sie bitte die Funktion args nicht bezahlen kann):

class User
{
 function signUp()
 {
  try
  {
   //executes a PDO query
   //returns a code/flag/string hinting the status of the sign up:
   //success, username taken, etc.
  }
  catch (PDOException $e)
  {
   //take the appropriate measure, e.g. a rollback

   //DataAccessException gets all the information (e.g. message, stack
   //trace) of PDOException, and maybe adds some other information too
   //if not, it is like a "conversion" from PDOException to DAE
   throw new DataAccessException();
  }
 }
}

//and in an upper layer
$user = new User();
try
{
 $status = $user->signUp();
 //display a message regarding the outcome of the operation
 //if it was technically successful
}
catch (DataAccessException $e)
{
 //a technical problem occurred
 //log it, and display a friendly error message
 //no other exception is thrown
}

Ist das eine richtige Lösung? Beim Wieder wirft den PDOException Ich glaube nicht, wäre es angebracht, Ausnahme Verkettungs zu verwenden (da dies nur Debug-Informationen überflüssig machen würde; DataAccessException alles bekommt, einschließlich der vollständigen Stack-Trace von PDOException).

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Wie ich Ihren Beitrag eine gute Ressource verstanden, ist dies: Api design

Ich denke, dass Sie Ihre Hausaufgaben gemacht haben (wenn ich den Satz verwenden kann), aber sie vergessen, den Grund, warum diese Sache getan wird. In Ihrem Beispiel würde ich so etwas wie

erstellen
SignUpException

, welche die oberen Schichten informieren würde, dass etwas über die Registrierung schief gegangen. Was Sie hier tun, ist im Wesentlichen eine Datenbank Ausnahme mit einem anderen Namen einer Maskierung, die im Wesentlichen die gleiche Sache ist, dass etwas zwar programmatisch richtig, den Punkt des vermisst warum es davon in dem ersten tun Platz.

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