En son web geliştirme öğreticiler
 

PHP İstisna işleme


İstisnalar belirli bir hata oluşursa bir kodun akışını değiştirmek için kullanılır.


İstisna nedir

PHP 5 ile birlikte hataları yeni bir nesne yönelimli yolu geldi.

İstisna işleme belirli bir hata durumunda, kod çalıştırma normal akışını değiştirmek için kullanılır (exceptional) durumu oluşur. Bu durum bir istisna olarak adlandırılır.

Bu bir istisna tetiklenir normalde böyle olur:

  • Varolan kod durumu kaydedilir
  • Kod yürütme önceden tanımlanmış geçer (custom) istisna işleyici işlevi
  • Duruma bağlı olarak, işleyici sonra, kaydedilen kod durumundan yürütülmesine devam komut yürütme sonlandırmak veya kodunda farklı bir konumdan senaryoyu devam edebilir

Şimdi farklı hata ayıklama yöntemlerini gösterecektir:

  • İstisnalar Temel kullanım
  • Özel bir istisna işleyicisi oluşturma
  • Çoklu istisnalar
  • Yeniden atma istisna
  • Bir üst düzey istisna işleyicisi ayarlama

Note: İstisnalar sadece hata koşulları kullanılmalıdır ve belirli bir noktada kodunda başka bir yere atlamak için kullanılmamalıdır.


İstisnalar Temel Kullanım

Bir istisna fırlatıldığında, kod yürütülmez takip ve PHP eşleştirme bulmaya çalışacağız "catch" bloğu.

Bir istisna yakalandı değilse, önemli bir hata bir verilecektir "Uncaught Exception" mesajının.

Bunu yakalamadan bir istisna oluşturmaya deneyin sağlar:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

Kod aşağıdaki gibi bir hata mesajı görüntülenir:

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Deneyin atmak ve yakalamak

Yukarıdaki örnekten hatayı önlemek için, bir istisna işlemek için uygun kodu oluşturmak gerekir.

Uygun istisna kodu içermelidir:

  1. Deneyin - Bir fonksiyon bir olmalıdır istisna kullanarak "try" bloğu. istisna tetiklemez, kod normal hayatına devam edecek. Istisna tetikler Ancak eğer bir istisna olduğu "thrown"
  2. Atmak - Bir istisna nasıl tetiklediğini budur. Her "throw" , en az bir olmalıdır "catch"
  3. Catch - "catch" bloğu bir istisnanın yakalandığı ve bilgilerini içeren bir nesne oluşturur

Geçerli kod ile bir istisna tetiklemek için deneyin sağlar:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

Kod aşağıdaki gibi bir hata mesajı görüntülenir:

Message: Value must be 1 or below

Örnek açıklanmıştır:

Yukarıdaki kod bir istisna atar ve yakalar;

  1. checkNum() fonksiyonu oluşturulur. Bir numara Eğer öyleyse, bir istisnası atılır 1'den büyük olup olmadığı kontrol eder
  2. checkNum() işlevi, bir de denir "try" bloğu
  3. Içinde istisna checkNum() fonksiyonu atılır
  4. "catch" bloğu istisnayı alır ve bir nesne oluşturur ($e) istisna bilgilerini içeren
  5. Istisnadan hata mesajı arayarak yankılandı $e-> getMessage() istisna nesneden

Ancak, tek yön etrafında almak için "every throw must have a catch" kuralı arasından kayıp hataları işlemek için bir üst düzey özel durum işleyici ayarlamaktır.


Özel bir durum Class oluşturma

Eğer bir istisna PHP oluştuğunda çağrılabilir fonksiyonları ile özel bir sınıf oluşturmak gerekir özel durum işleyici yaratmak. sınıf istisna sınıfının bir uzantısı olmalıdır.

Özelleştirilmiş bir istisna sınıfı PHP istisna sınıfından özelliklerini devralır ve ona özel işlevler ekleyebilir.

Bir istisna sınıf oluşturmak sağlar:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Yeni sınıf bir eklenmesiyle eski istisna sınıfının bir kopyasıdır errorMessage() fonksiyonu. Eski sınıfın bir kopyası olduğunu ve eski sınıftan özellikleri ve yöntemleri miras yana, böyle bir istisna sınıfı yöntemlerini kullanabilirsiniz getLine() ve getFile() ve getMessage() .

Örnek açıklanmıştır:

Yukarıdaki kod bir istisna atar ve özel bir istisna sınıfı ile yakalar:

  1. customException() sınıfı eski istisna sınıfının bir uzantısı olarak oluşturulur. Bu şekilde eski istisna sınıfından tüm yöntemleri ve özellikleri devralır
  2. errorMessage() fonksiyonu oluşturulur. Bir e-posta adresi geçersiz Bu fonksiyon bir hata mesajı döndürür
  3. $ E-posta değişkeni geçerli bir e-posta adresi olmayan bir dizeye ayarlanır
  4. "try" blok yürütülür ve e-posta adresi geçersiz ise bir istisna atılır
  5. "catch" bloğu istisnayı yakalar ve hata iletisi görüntüler

Çoklu İstisnalar

Bir komut birden fazla koşul kontrol etmek için birden fazla istisnaları kullanmak mümkündür.

Birkaç if..else blokları, bir anahtarı veya iç içe birden istisnalar kullanmak mümkündür. Bu istisnalar farklı istisna sınıflarını kullanabilir ve farklı hata mesajları edebilirsiniz:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

Örnek açıklanmıştır:

Yukarıdaki kod iki durumda ve herhangi yerine getirilmediği takdirde bir istisna atar:

  1. customException() sınıfı eski istisna sınıfının bir uzantısı olarak oluşturulur. Bu şekilde eski istisna sınıfından tüm yöntemleri ve özellikleri devralır
  2. errorMessage() fonksiyonu oluşturulur. Bir e-posta adresi geçersiz Bu fonksiyon bir hata mesajı döndürür
  3. $ E-posta değişkeni geçerli bir e-posta adresi olan bir dizeye ayarlanır, ancak dize içerir "example"
  4. "try" bloğu çalıştırılır ve ilk durumda istisna atılan edilmez
  5. E-posta ifadesini içerdiğinden ikinci koşulu bir istisna tetikler "example"
  6. "catch" bloğu istisnayı yakalar ve doğru hata iletisi görüntüler

atılan istisna sınıfı customException vardı ve hiçbir customException yakalamak sadece baz istisna catch istisna vardır ele alacağını, olsaydı.


Yeniden atma İstisnalar

Bir özel durum zaman Bazen, standart bir şekilde farklı bir şekilde isteyebilirler. Bir içinde ikinci tekrarda istisna atmak mümkündür "catch" bloğu.

Bir komut dosyası kullanıcılardan sistem hataları gizlemek gerekir. Sistem hataları kodlayıcı için önemli, ancak kullanıcı için hiçbir ilgilendiren olabilir. kullanıcı için bir şeyler kolaylaştırmak için bir kullanıcı dostu mesajla istisna yeniden atabilir:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Örnek açıklanmıştır:

Testler yukarıda kodunun e-posta adresi dize içeriyorsa "example" eğer olursa, istisna yeniden atılır, onun içinde:

  1. customException() sınıfı eski istisna sınıfının bir uzantısı olarak oluşturulur. Bu şekilde eski istisna sınıfından tüm yöntemleri ve özellikleri devralır
  2. errorMessage() fonksiyonu oluşturulur. Bir e-posta adresi geçersiz Bu fonksiyon bir hata mesajı döndürür
  3. $ E-posta değişkeni geçerli bir e-posta adresi olan bir dizeye ayarlanır, ancak dize içerir "example"
  4. "try" blok başka içeriyor "try" mümkün durum atması yapmak için blok
  5. E-posta ifadesini içerdiğinden istisna tetiklenir "example"
  6. "catch" bloğu istisnayı yakalar ve yeniden atar "customException"
  7. "customException" yakalanmış ve bir hata iletisi görüntüler edilir

İstisna bugünkü yakalanmış değilse "try" bloğunda, bu bir catch bloğu arayacaktır "higher levels" .


Üst Seviye İstisna Handler Set

set_exception_handler() fonksiyonu yakalanmamış istisnalar işlemek için kullanıcı tanımlı bir işlev ayarlar.

<?php
function myException($exception) {
  echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

Yukarıdaki kod çıktısı şu şekilde olmalıdır:

Exception: Uncaught Exception occurred

Kodunda yukarıdaki hiçbir yoktu "catch" bloğu. Bunun yerine, üst düzey istisna işleyicisi tetikledi. Bu fonksiyon yakalanmamış istisnaları yakalamak için kullanılmalıdır.


istisnalar kuralları

  • Kod potansiyel durumları yakalamak yardımcı olmak için, bir try bloğu içine edilebilir
  • Her blok veya deneyin "throw" catch bloğu karşılık gelen en az bir olması gerekir
  • Birden fazla catch bloğu istisnalar farklı sınıfları yakalamak için kullanılabilir
  • İstisnalar atılmış olabilir (or re-thrown) bir try bloğu içinde bir catch bloğunda

Basit bir kural: Eğer bir şey atmak, onu yakalamak zorundayız.