Ben bir veritabanı sorgusu ile bir istisna kullanabilir miyim?

4 Cevap

Yerine kalıp bir mysql sorgu sonunda () bir istisna kullanmak mümkün mü? Ben bir istisna atmak ve yerine komut öldürme bunu log istiyorum.

Sanki bitmiş olacaktır:

mysql_query(...) or throw new exception()??

4 Cevap

Bu normalde bunu yoludur. Ben bir sarıcı sınıf benim veritabanı var, bu yüzden $this sadece sargıya eder.

private function throwException($query = null)
{
    $msg = mysql_error().".  Query was:\n\n".$query.
                   "\n\nError number: ".mysql_errno();
    throw new Exception($msg);
}

public function query($query_string)
{
    $this->queryId = mysql_query($query_string);
    if (! $this->queryId) {
        $this->throwException($query_string);
    }
    return $this->queryId;
}

Bu benim için güzel bir hata mesajı ile tüm kadar paketler, bu yüzden sorun sorgu görebilirsiniz. Elbette çok daha basit tutmak, ve yapabileceği:

mysql_query($sql) or throw new Exception("Problem with query: ".$sql);

Evet. Neredeyse her yerde geleneksel kullanmak istiyorum bir istisna kullanabilirsiniz die/exit.

Evet, yerine komut öldürme bir istisna atabilir.

Size verilen kod iyi çalışır:

mysql_query(...) or throw new Exception("Failed to run query");

Ama bu tamamen açık değildir Steno kullanıyor. Ben şahsen netlik için kısalık feda daha iyi olduğumuzu düşünüyorum:

if (false === mysql_query(...)) {
    throw new Exception("Failed to run query.");
}

Bir yerde onları yakalamak eğer İstisnalar atma sadece yararlı olduğunu akılda tutmak, ve sizin durumunuzda muhtemelen özel bir durum kullanmak istiyorsanız:

class DatabaseException extends Exception {}

try {
    if (false === mysql_query(...)) {
        throw new DatabaseException("Failed to run query.");
    }
} catch (DatabaseException $e) {
    $logger->log("Database exception: " . $e->getMessage());
}

Umarım ki olur!