Hallo Leute, ich setze mich gerade ein wenig mit Exceptions auseinander und finde irgendwie keine zufriedenstellende Lösung.
Was das Script so alles macht, ist nicht wichtig, es geht mir nur uim die Exceptions!
Ich habe hier mal ein Zend-Beispielscript, bei dem ich die Klasse zur Userauthentifizierung in eine Datei "class.userauth.php" gepackt habe.
Und die index.php mit der Klasse arbeitet... sieht dann wie folgt aus:
Ich finde das ganze sehr unübersichtlich und auch irgendwie fehlerprovozierend. Überall, wo ich die Klasse "class.userauth.php" benutzen möchte (wie hier in der index.php) muss ich erst die subclass-exceptions erzeugen:
// subclass exceptions
class FileException extends Exception {};
class AuthException extends Exception {};
*....ANDERER CODE....*
Dann muss ich die Klasse "class.userauth.php" analysieren, welche Exceptions alle ausgelöst werden können und diese alle einzeln abfangen:
catch (FileException $e){
*....*
}
catch (AuthException $e){
*....*
}
catch (Exception $e) {
*....*
}
Da passiert es doch leicht, dass ich mal einen Catch-Block vergesse, eine Sucbclasse nicht anlege o.ä.
Zudem ist auch nicht gleich erkennbar, welcher Catch-Block jetzt welche Ausnahme behandelt, da diese ja in der Datei "class.userauth.php" ausgelöst werden?
Mir kommt das sehr umständlich und unübersichtlich vor :-(
Was das Script so alles macht, ist nicht wichtig, es geht mir nur uim die Exceptions!
Ich habe hier mal ein Zend-Beispielscript, bei dem ich die Klasse zur Userauthentifizierung in eine Datei "class.userauth.php" gepackt habe.
PHP-Code:
// class definition
class userAuth {
// define properties
private $username;
private $passwd;
private $passwdFile;
// constructor
// must be passed username and non-encrypted password
public function __construct($username, $password) {
$this->username = $username;
$this->passwd = $password;
}
// set .htaccess-style file to check for passwords
public function setPasswdFile($file) {
$this->passwdFile = $file;
}
// perform password verification
public function authenticateUser() {
// check that the file exists
if (!file_exists($this->passwdFile)) {
throw new FileException("Password file cannot be found: " . $this->passwdFile);
}
// check that the file is readable
if (!is_readable($this->passwdFile)) {
throw new FileException("Unable to read password file: ". $this->passwdFile);
}
// read file
$data = file($this->passwdFile);
// iterate through file
foreach ($data as $line) {
$arr = explode(":", $line);
// if username matches, test password
if ($arr[0] == $this->username) {
// get salt and crypt(), assuming encryption
$salt = substr($arr[1], 0, 2);
// if match, user/pass combination is correct
if ($arr[1] == crypt($this->passwd, $salt)) {
echo "User was authenticated";
// do some other stuff
}
// otherwise return exception
else {
throw new AuthException("Incorrect password");
break;
}
}
else {
// could not find a username match
// return exception
throw new AuthException("No such user");
}
}
}
// end class definition
}
PHP-Code:
require_once("class.userauth.php");
// subclass exceptions
class FileException extends Exception {};
class AuthException extends Exception {};
// try the code
try {
// create instance
$ua = new userAuth("joe", "secret");
// set password file
$ua->setPasswdFile("password.txt");
// perform authentication
$ua->authenticateUser();
}
// catch authentication failures, if any
catch (FileException $e) {
// print file errors
print "A file error occurred. ".$e->getMessage();
}
catch (AuthException $e) {
// an authentication error occurred
print "An authentication error occurred. ".$e->getMessage();
// more normally, redirect to new page on auth errors, e.g.
// header ('Location: login_fail.php');
}
catch (Exception $e) {
print "An unknown error occurred";
}
// subclass exceptions
class FileException extends Exception {};
class AuthException extends Exception {};
*....ANDERER CODE....*
Dann muss ich die Klasse "class.userauth.php" analysieren, welche Exceptions alle ausgelöst werden können und diese alle einzeln abfangen:
catch (FileException $e){
*....*
}
catch (AuthException $e){
*....*
}
catch (Exception $e) {
*....*
}
Da passiert es doch leicht, dass ich mal einen Catch-Block vergesse, eine Sucbclasse nicht anlege o.ä.
Zudem ist auch nicht gleich erkennbar, welcher Catch-Block jetzt welche Ausnahme behandelt, da diese ja in der Datei "class.userauth.php" ausgelöst werden?
Mir kommt das sehr umständlich und unübersichtlich vor :-(
Kommentar