Farklı isimler altında istisnalar yeniden atma?

2 Cevap php

Şu anda benim PHP MVC web uygulaması bu istemci kodu vardır:

try {
  BookMapper::insert($book);
} catch (DbUniqueConstraintViolationException $e) {
  $errorList->addMessage($book . " already exists!");
}

Bu düşük seviyeli çerçevesinde Db başvurmak için kötü bir uygulamadır ben merak olduğunu * müvekkilim kodu istisnalar? Eğer öyleyse, ben bu yüzden gibi benim modeli kodu ayarlamak gerekir:

class BookAlreadyExistsException extends Exception { }

class BookMapper {
  public static function insert($book) {
    try {
      // call to DB-layer to insert $book
      // (not relevant to the question)
    } catch (DbUniqueConstraintViolationException $e) {
      throw new BookAlreadyExistsException();
    }
  }
}

ve sonra bu yeni bir istemci-kodu kullanabilirsiniz ...

try {
  BookMapper::insert($book);
} catch (BookAlreadyExistsException $e) {
  $errorList->addMessage($book . " already exists!");
}

Ya da başka bir şey mi? Ya da orijinal yöntem gayet iyi?

Teşekkürler!

EDIT: Sadece ikinci yöntem IMO iyi okur, eklemek istiyorum, ama bu nesne oluşturma / havai yeniden atma ve daha da önemlisi, her Eşleştiricisi'nin insert () yöntemi yeniden atma kodu çoğaltma gerektirir ile geliyor. Eski yöntemi uygulamak ve yakalamak kolaydır ve herhangi bir model için çalışır ama bunu bu şekilde yapmak gerektiğini okuduğumu hatırlıyorum?

2 Cevap

Ben kesinlikle kendi özel atmak gerektiğini düşünüyorum.

Ama aynı zamanda üçüncü bir seçenek ve insert yöntemi başarı ve başarısızlık için false için true döndüren icar olduğunu düşünecektim. İstisnalar istisnalar için kullanılması gerektiğini ve bir kitap zaten var olduğu gerçeği aslında beklenen bir / öngörülebilir durum olabilir.

Ve yinelenen kitaplar gerçekten mümkün olmamalıdır excetions eğer (programlama hataları için sürece), o zaman sen de veritabanı haricinde sopa olabilir ama bu durumda onu yakalamak değil. Tüm yol kadar kabarcık olsun.

Tavsiye ederim this article. Java için yazılmış olsa da, ilkeleri de PHP için oldukça geçerlidir. Bu and alıcı sen atma gerektiğini istisnalar ne tür için iyi kurallar vardır.