php teknik ve kullanıcı bakan hata mesajları organize

2 Cevap php

Ben iki etkileşim sınıfları için benim hata mesajları organize biraz sorun yaşıyorum. Bir nesne bir şeyler ters gitti, ya da beklenmedik oldu 'hata-ISH' durumları vardır, ama durum hala kurtarılabilir. Ben hatasından sonra nesneye erişmek istiyorum çünkü sadece. Mesajında, ve 2, tek bir dize var çünkü. Durumlar, 1 kullanmak istemiyorum. En azından, ben istisna sonra yararlı bir hata mesajı oluşturmak için onun get'in bazı () yöntemleri kullanmak istiyorum!

Bir şeyler yanlış gitti, kodlayıcı olarak kendime bir: Sonuçta ben iletişim kurmak istiyorum iki mesaj var. Bu dize, dosya, satır, fonksiyon / yöntem, argümanlar, ve sonuçların teknik detaylara sahip olacaktır. Açıkçası, ben kullanıcıya bunu göstermek istemiyorum, yani (bir şey bir tür "Bu e-posta adresi bulunamadı") Ben kullanıcıya göstermek istiyorum, bir hata mesajı başka bir dize var.

Yani düşünce çeşitli mesajlar için tuşları gibi, istisnalar hata kodu ya da bir durum kodu kullanabilirsiniz bir hata mesajı dizi, inşa etmek bana oluşur. (Ben bunu yaparsanız, nerede mesajların dizisini saklamak?) Başka bir seçenek bir hata durumu nesne yapmak için olabilir.

Desen tasarımı benzer "hata desen" gibi bir şey var mı?

2 Cevap

İstisnalar gerçekten istediğin her şeyi yapmak, en iyi seçenektir. Istisnalar siz uzatabilirsiniz sadece sınıfları beri hatta birden mesajları mümkündür. Sadece durum söz konusu duruma neden olur nesneyi geçebileceği.

<?php
class ExampleException extends Exception {
  private $secondMessage;
  private $objectThatCausedIt;
  public function __construct( $secondMessage, $objectThatCausedIt ) {
    parent::__construct(
      "Descriptive message for developer",
      // error code for this type of error
      1000 );
    $this->secondMessage = $secondMessage;
    $this->objectThatCausedIt = $objectThatCausedIt;
  }
  public function getSecondMessage() {
    return $this->secondMessage;
  }
  public function getObjectThatCausedIt() {
    return $this->objectThatCausedIt;
  }
}

class Example {
  public function causeException() {
    throw new ExampleException( "Second Message", $this );
  }
}

Şimdi sadece sınıfını kullanın ve bir try-catch bloğunda istisna olabilir çağrıyı sarın.

<?php
$example = new Example();
try {
  $example->causeException();
}
catch ( ExampleException $e ) {
  // kind of pointless here, just an illustration
  // get object that caused it and do something with it.
  dump_and_log_function( $e->getObjectThatCausedIt() );
  // or just use $example, which is still "alive"
  // and references the same instance
  dump_and_log_function( $example );
}

İstisna uzanan Ayrıca bir backtrace yığını olsun yararı vardır. Backtrace durum oluştu hangi dosya, hat ve işlev gibi bilgileri içerir. Ayrıca hata kodu, mesajı ve daha fazlasına erişebilirsiniz. Ben (http://php.net/manual/en/class.exception.php) Daha fazla bilgi için İstisnalar üzerinde PHP belgeleri okumanızı öneririz.

Hata mesajları ve günlüğü ile ilgili olarak, ben genelde bunun için bir tek sınıf kullanabilirsiniz. Bir tekil sınıf kendisi sadece bir örnek vardır (. Durumda bilmiyordum) Burada son derece basit bir örnek:

<?php
class Log {
  private $logFile;
  private static $instance;
  /* Log instances may only be constructed in Log::getInstance */
  private function __construct() {
    $this->logFile = fopen( "path/to/log/file", "a" );
  }
  public logMessage( $message ) {
    fwrite( $this->logFile, $message );
  }
  public static getInstance() {
    if ( !self::$instance ) self::$instance = new self();
    return self::$instance;
  }
}

Şimdi atış geri-catch bloğu işleme istisna olacak, bu böyle bir şey için değiştirebilirsiniz:

<?php
$example = new Example();
try {
  $example->causeException();
}
catch ( ExampleException $e ) {
  // log developer message and backtrace
  Log::getInstance()->logMessage( $e->getMessage() );
  Log::getInstance()->logMessage( $e->getTraceAsString() );
  // or more compact by casting to string
  Log::getInstance()->logMessage( (string)$e );
  // and now print error for users
  echo "<p>An Error has occured: {$e->getSecondMessage()}</p>";
}

Bunun yerine hemen hata mesajı yankılanan, sen Log sınıf mesajların bir dizi ile bir özelliği vardır yapabilir. Sonra tek seferde daha sonra bir görünüm komut onları liste olabilir. Onlar (sadece oturumdan mesajları temizlemek için unutmayın bir yeniledikten sonra görüntülenir olabilir ya da üzerinde görüntülenir ve tekrar tekrar ;-) olacak böylece de oturumda LogMessage yöntem mağaza mesajları yapabilir.

I don't want to use exceptions, 1. because they only have a single string for the message, and 2. because I want to access the object after the error. At the very least, I want to use some of its get() methods to construct a useful error message after the exception!

Kendi istisna sınıflarını oluşturabilir ve size ihtiyacınız olan desteği ekleyerek, PHP'nin istisna sınıflarını uzatabilirsiniz. Ancak, muhtemelen, istemci hataları ekran ve geliştirici hataları yerine günlük dosyasına ya da bir şey olacak değil mi Goto iki ayar, geliştirici ve müşteri, olabilir.

Hangi, (eğer çok daha fazla olabilir ama, ben iki ayrı temel sınıfları söylüyorum) iki özel durum tipe çevirir.