SORU
5 NİSAN 2011, Salı


Yakalama ve yeniden atma özel durumlar için en iyi uygulamalar nelerdir?

Yakalanan özel durumlar yeniden oluşturuldu doğrudan olmalı, ya da yeni bir durum sarılı olmalıdır?

Yani, bunu yapmak gerekir:

try {
  $connect = new CONNECT($db, $user, $password, $driver, $host);
} catch (Exception $e) {
  throw $e;
}

ya da bu:

try {
  $connect = new CONNECT($db, $user, $password, $driver, $host);
} catch (Exception $e) {
  throw new Exception("Exception Message", 1, $e);
}

Cevabınız için isedoğrudan doğruyalütfen öneririzözel durum zincirlemeÖzel durum zincirleme kullanarak gerçek dünya bir senaryo anlamak mümkün değil.

CEVAP
5 NİSAN 2011, Salı


Bu özel yakalama olmamalıanlamlı bir şeyler yapmayı düşünmüyorsanız.

"Anlamlı bir şey" bunlardan biri olabilir.:

Özel durum işleme

En belirgin anlamlı eylem özel, örneğin, bir hata iletisi görüntüleniyor ve işlemi iptal ederek işlemek için:

try {
    $connect = new CONNECT($db, $user, $password, $driver, $host);
}
catch (Exception $e) {
    echo "Error while connecting to database!";
    die;
}

Günlük veya kısmi temizleme

Bazen bir şey bildiğin yok senin nasıl düzgün bir şekilde işlemek için bir istisna içinde belirli bir bağlam; belki de eksikliği hakkında bilgi "büyük resim", ama yapmak istiyorum günlük başarısızlık olarak yakın noktaya olduğu gibi mümkün. Bu durumda, yakalamak, oturum açmak isteyebilirsiniz, ve tekrar atmak

try {
    $connect = new CONNECT($db, $user, $password, $driver, $host);
}
catch (Exception $e) {
    logException($e); // does something
    throw $e;
}

İlgili bir senaryo doğru yerde başarısız operasyon için bazı temizleme işlemleri için nerede, ancak başarısızlık, en üst düzeyde nasıl ele alınması gerektiğine karar vermek değildir. Önceki PHP sürümlerinde bu gibi uygulanamadı

$connect = new CONNECT($db, $user, $password, $driver, $host);
try {
    $connect->insertSomeRecord();
}
catch (Exception $e) {
    $connect->disconnect(); // we don't want to keep the connection open anymore
    throw $e; // but we also don't know how to respond to the failure
}

PHP 5.5 finally anahtar kelime tanıttı, temizleme senaryo için şimdi bu yaklaşım için başka bir yolu yoktur. Eğer temizleme kodu ne olursa olsun çalıştırmak için (örneğin, başarı, hata ve) gerekiyorsa artık mümkün şeffaf bir şekilde her atılan özel durumlar yaymak için izin verirken bunu yapmak için:

$connect = new CONNECT($db, $user, $password, $driver, $host);
try {
    $connect->insertSomeRecord();
}
finally {
    $connect->disconnect(); // no matter what
}

Hata soyutlama (özel durum zincirleme)

Üçüncü bir durum mantıksal olarak daha büyük bir şemsiye altında birçok olası hataları grubu için tam aradığınız yer. Mantıksal gruplama için bir örnek:

class ComponentInitException extends Exception {
    // public constructors etc as in Exception
}

class Component {
    public function __construct() {
        try {
            $connect = new CONNECT($db, $user, $password, $driver, $host);
        }
        catch (Exception $e) {
            throw new ComponentInitException($e->getMessage(), $e->getCode(), $e);
        }
    }
}

Bu durumda, istemezsin kullanıcıların Component bunu bilmek için uygulanır kullanarak bir veritabanı bağlantısı (belki senin almak istediğin seçenekleri ve kullanımı dosya tabanlı depolama gelecekte). Component şartname o ki "bir başlatma hatası durumunda, ComponentInitException atılır". Bu Component tüketicilerin beklenen türde istisnalar yakalamak için izin verirayrıca hata ayıklama kodu (uygulama bağımlı) tüm detayları erişmek için izin verirken.

Daha zengin içerik (özel durum zincirleme ile) sağlar

Son olarak, bu özel durum için daha fazla bağlam sağlamak için isteyebilirsiniz durumlar vardır. Bu durumda mantıklı zaman hata yapmaya çalıştığın şey hakkında daha fazla bilgi sahip olan diğer bir istisna sarmak için yapar. Örneğin:

class FileOperation {
    public static function copyFiles() {
        try {
            $copier = new FileCopier(); // the constructor may throw

            // this may throw if the files do no not exist
            $copier->ensureSourceFilesExist();

            // this may throw if the directory cannot be created
            $copier->createTargetDirectory();

            // this may throw if copying a file fails
            $copier->performCopy();
        }
        catch (Exception $e) {
            throw new Exception("Could not perform copy operation.", 0, $e);
        }
    }
}

Bu durum benzer, yukarıda (ve örnek pek iyi bir yukarı gelebilir, ama bunu göstermektedir noktası sağlayarak daha fazla içerik: eğer bir istisna atılır, bize dosya kopyalama işlemi başarısız oldu. Amanedenbaşarısız oldum? Bu Bilgi sarılmış istisna olan ise çok daha karmaşık olsaydı birden fazla düzeyde olabilir () sağlanır.

Değer yapıyor bu resimli düşünürseniz bir senaryo, örneğin oluşturma UserProfile nesne nedenleri dosyaları kopyalanacak çünkü kullanıcı profili saklanır dosya ve Destekler hareket semantiği: "Geri Al" değişiklikleri çünkü onlar sadece üzerinde gerçekleştirilen bir kopyasını profilini kadar işledin.

Eğer sen yaptıysan bu durumda

try {
    $profile = UserProfile::getInstance();
}

ve sonuç yakalanmış bir "Hedef dizin oluşturulamadı" özel durum hata, kafası karışmış olma hakkına sahip olur. Bu "içerik sunan diğer istisnalar katmanları içinde özel durum hatası çok daha kolay başa çıkmak için yapacaktır ("profil kopya Oluşturma başarısız oldu" -^. çekirdek sarma "Dosya kopyalama işlemi başarısız oldu" ->"Hedef dizin oluşturulamadı").

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • RickardRick

    RickardRick

    9 Mart 2007
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005