PHP hataları işleme

6 Cevap php

Ben aradım, bir sayfaya yönlendirme ve GET aracılığıyla 'message_type' ve 'mesaj' değişkeni gönderecek, özel bir sınıf var. Sayfa açıldığında bu değişkenler için kontrol eder ve 'message_type' değişkene bağlı bir 'başarı', 'uyarı', ya da 'hata' mesajı görüntüler. Ben bu kadar kullanıcı aynı sayfada kalmak düşünüyor yaptı. Diğer değişkenler mesaj ile birlikte aktarılabilir için de izin verir.

Bu iyi bir uygulama mı, yoksa sadece özel durumlar kullanmaya başlamak gerekir?

Örnek:

//Call a static function that will redirect to a page, with an error message
RedirectWithMessage::go('somepage.php', MessageType::ERROR, 'Error message here.');

Aşağıdaki checkMessage () fonksiyonu içerir dosyası:

function checkMessage()
{
    if((isset($_GET['message_type']) && strlen($_GET['message_type'])) && (isset($_GET['message']) && strlen($_GET['message_type'])))
    {
        DisplayMessage::display($_GET['message_type'], $_GET['message']);
        return true;
    }
    return false;
}

() CheckMessage aramak için yönlendirilir sayfasında;

//If a message is received, display it. If not, do nothing
checkMessage();

Ben bu belirsiz olabileceğini biliyorum, ve gerekirse daha fazla kod sağlayabilmektedir. Ben sorunu ben istisnaları kullanılarak çok deneyimi yok sanırım, ama onlar (her yerde try-catch bloğu yazma), hantal görünüyor düşünüyorum. Daha iyi bir çözüm yoktur kendim için ya da ben bu daha zor hale ediyorsam bana bildirin lütfen.

Thanks! Mike

6 Cevap

Bunu ben kendi oturumda ($_SESSION) ilgili hata bilgi depolamak rağmen, ben onun yerine, çok benzer bir şey yapmak bunu yapmak için iyi bir yol olduğunu düşünüyorum, ve bu görüntülenen hemen sonra temizleyin. Bu sorgu dizesi dışına tutar ve onlar sayfayı yenileyin eğer bu kadar hata kaybolduktan yapar

Hatalar ve istisnalar tamamen aynı değildir. İstisnalar harici bir kaynak ya da uygulama durdurmak için neden bir istisna olarak gördükleri, belki bir kullanıcının girişine bağlamak mümkün veritabanına bağlanamıyor gibi "istisnai" durumlar vardır hatalardır.

Istisnaları kullanarak, size modelleri / iş nesneleri köpüren hata uygulayabilirsiniz ve sadece (İdeal eğer MVC deseni kullanarak değil denetleyici veya ana sayfada) çağrı yığını kadar yüksek hata yakalamak, göz önüne alındığında. Doğrudan mesaj atmak istiyorsanız, bu iyi, ama size sadece kendi mesajları ile bir nesne ya da hatalar diziyi oluşturmak hatta aynı hata lokalizasyonu veya mesaj varyantları destekleyebilir böylece sadece hata kodları kullanmak isteyebilirsiniz. Bir istisna olarak hatayı yakalamış, daha sonra bir değişkene tampon ve sadece şablon veya görünümünde görüntülemek veya bir ortak mesaj sayfasına yönlendirme yapabilirsiniz.

<?php
  class SampleModel
  {
      public function validate($params)
      {
           if (!is_array($params)) {
                 throw new Exception("Input provided is not valid");
           }
           //add as many validations as you want.
           return TRUE;
      }  
  }
 ?> 

Kullanımı:

<?php
      $model = new SampleModel();
      $input = "not an array"; 
      $msg = null;       
      $msgtype = null; 
      try {       
          $result = $model->validate($input); //this will throw a user-defined exception because we are passing a string instead of an array
          if ($result) {
              $msgtype = "success"; 
              $msg = "Successful validation";
          }

      } catch(Exception $e) {
          $msg = $e->getMessage();
          $msgtype = "Fatal error";  
      }

      RedirectWithMessage::go('somepage.php', $msgtype, $msg);

Kesinlikle yönlendirmek gerekmez, sadece hata türüdür için sayfa şablonu farklı bir dizi yükleyin.

      //load the appropriate template/view class. You need to create this class or use a framework.
      LoadWithMessage::display('sometemplate.inc.php', $msgtype, $msg); 

Yukarıdaki örnek kod, tipik bir denetleyici.

Eğer (sizin bekliyor uygulama büyük olması durumunda) dağıtılan gitmek kez de, $ _SESSION söz değil ek gecikme için bir performans yükü var. Gerçekten hata mesajları için kullanarak tavsiye etmem. Ben genellikle sadece veri kalıcılığı için kullanmak istiyorum. Hata mesajları devam gerekiyordu ve web doğada vatansız olduğunu değildir.

Ben İstisnalar ve deneyin / catch blokları gitmek için bir yol olup olmadığını emin değilim, ama başka bir sayfaya yönlendirmek zorunda kalmadan sizin başarı veya aynı sayfada hata iletileri inşa etmek mümkün olabilir.

Ayrıca, IF koşulu için bu ayar aynı sonuçları okumak ve başarmak gerekir biraz daha kolaydır:

if(!empty($_GET['message_type']) && !empty($_GET['message']))

Ben kullanmak I try / catch işlemini hiç anlamadım çünkü 'eğer', bir sürü kontrol. Ben de $ _SESSION hatayı koyarak fikir gibi.

Bir şey sizin iş mantığı bu yürütülüyor PHP sayfaları bağlı, ve olabilir gibi görünüyor böylece size bunu yönlendirmek zorunda ile sıkışmış olacak gibi, sen stuggle olabilecek farklı bir bağlamda bazı bunu yeniden istedim hata belirli bir sayfa için.

İstisnaları kullandıysanız hemen bu hatayı yakalama ve devam, ya da (örneğin, kullanıcıya bir hata sayfası vazgeçerek ve gösteren) daha yukarı ele izin seçim olurdu.

Oturumu dizideki tüm mesajları saklamak. Bu sınıf yapmak konusunda sana yardım olabilir, bu http://flourishlib.com/browser/fMessaging.php