İ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.