php-istisna-isleme

İstisna nedir

PHP 5 ile hatalarla uğraşmak için yeni bir nesne yönelimli yol geldi.

Özel durum işleme, belirli bir hata (istisnai) durum ortaya çıkarsa, kod yürütülmesinin normal akışını değiştirmek için kullanılır. Bu duruma istisna denir.

Bir istisna tetiklendiğinde normalde bu gerçekleşir:

Mevcut kod durumu kaydedildi

Kod yürütme önceden tanımlanmış (özel) bir istisna eylemcisi işlevine geçecektir.

Duruma bağlı olarak, işleyici, kaydedilen kod durumundan yürütmeye devam edebilir, kod yürütülmesini sonlandırabilir veya kodu koddaki farklı bir konumdan devam ettirebilir

Farklı hata işleme yöntemlerini göstereceğiz:

İstisnaların temel kullanımı

Özel bir istisna işleyici oluşturma

Birden çok istisna

Bir istisnayı yeniden atmak

Üst düzey bir istisna işleyicisi ayarlama



Not: İstisnalar sadece hata koşullarıyla kullanılmalı ve kodda belirtilen bir noktada başka bir yere atlamak için kullanılmamalıdır.



İstisnaların Temel Kullanımı

Bir istisna atıldığında, onu takip eden kod yürütülmez ve PHP eşleşen "catch" bloğunu bulmaya çalışacaktır.

Bir istisna yakalanmazsa, "Yakalanmamış Özel Durum" mesajıyla ölümcül bir hata verilir.

Yakalamadan bir istisna atmayı deneyelim:

< ?php

//bir istisna ile fonksiyon yaratmak

function checkNum($number) {

if($number>1) {

throw new Exception("Değer 1 veya daha küçük olmalıdır");

}

return true;

}

//tetikleme istisnası

checkNum(2);

?>

Yukarıdaki kod böyle bir hata alacak:



Fatal error: Uncaught exception 'Exception'

with message 'Value must be 1 or below' in C:webfoldertest.php:6

Stack trace: #0 C:webfoldertest.php(12):

checkNum(28) #1 {main} thrown in C:webfoldertest.php on line 6



Dene, fırlat ve yakala

Yukarıdaki örnekteki hatayı önlemek için, bir istisnayı ele almak için uygun kodu oluşturmamız gerekiyor.

Uygun istisna kodu şunları içermelidir:

try

- Bir istisnayı kullanan bir işlev "try" bloğunda olmalıdır. Kural dışı durum tetiklenmezse, kod normal olarak devam eder. Ancak istisna tetiklenirse, bir istisna "atılır"

throw

- Bu bir istisna nasıl tetiklersiniz. Her "atma" en az bir "catch" a sahip olmalıdır.

catch

- "catch" bloğu bir istisna alır ve istisna bilgilerini içeren bir nesne oluşturur

Geçerli kodla bir istisnayı tetiklemeyi deneyelim:

< ?php

//bir istisna ile fonksiyon yaratmak

function checkNum($number) {

if($number>1) {

throw new Exception("Değer 1 veya daha küçük olmalıdır");

}

return true;

}

//"try" bloğunda tetikleme istisnası

try {

checkNum(2);

//Özel durum atılırsa, bu metin gösterilmeyecek

echo 'Bunu görürseniz, sayı 1 veya daha azdır';

}

//istisna yakalamak

catch(Exception $e) {

echo 'Message: ' .$e->getMessage();

}

?>

Yukarıdaki kod bir istisna atar ve yakalar:



CheckNum () işlevi oluşturuldu. Bir sayının 1'den büyük olup olmadığını kontrol eder. Varsa, bir istisna atılır.

CheckNum () işlevi "try" bloğunda çağrılır

CheckNum () işlevi içindeki istisna atılır.

"Catch" bloğu istisnayı alır ve istisna bilgilerini içeren bir nesne ($ e) oluşturur

Özel durumdan gelen hata iletisi, istisna nesnesinden $ e-> getMessage () çağrılarak yankılanır.

Ancak, "her atışta bir yakalama olmalı" kuralını aşmanın bir yolu, içinden geçen hataları işlemek için bir üst düzey özel durum işleyicisi belirlemektir.



Özel İstisna Sınıfı Oluşturma

Özel bir özel durum işleyici oluşturmak için, PHP'de bir özel durum oluştuğunda çağrılabilen işlevlere sahip özel bir sınıf oluşturmanız gerekir. Sınıf, istisna sınıfının bir uzantısı olmalıdır.

Özel istisna sınıfı, PHP'nin istisna sınıfından özellikleri miras alır ve ona özel işlevler ekleyebilirsiniz.

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

< ?php

class customException extends Exception {

public function errorMessage() {

//hata mesajı

$errorMsg = 'Satırdaki hata'.$this->getLine().' in '.$this->getFile()

.': <b>'.$this->getMessage().'</b> geçerli bir e-posta adresi değil';

return $errorMsg;

}

}

$email = "someone@example...com";

try {

//check if

if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {

//e-posta geçerli değilse istisna atar

throw new customException($email);

}

}

catch (customException $e) {

//özel mesaj göster

echo $e->errorMessage();

}

?>

Yeni sınıf, errorMessage () işlevinin eklenmesiyle eski istisna sınıfının bir kopyasıdır. Eski sınıfın bir kopyası olduğu ve eski sınıfın özelliklerini ve yöntemlerini miras aldığından, getLine () ve getFile () ve getMessage () gibi istisnai sınıf yöntemlerini kullanabiliriz.

Örnek açıklandı:

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

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 miras alır.

ErrorMessage () işlevi oluşturuldu. Bu işlev, bir e-posta adresi geçersiz olduğunda bir hata iletisi döndürür

$ E-posta değişkeni geçerli bir e-posta adresi olmayan bir dizeye ayarlandı

"Try" bloğu yürütülür ve e-posta adresi geçersiz olduğundan bir istisna atılır.

"Catch" bloğu istisnayı yakalar ve hata mesajını görüntüler



Çoklu İstisnalar

Bir komut dosyasının birden çok koşulu denetlemek için birden çok özel durum kullanması mümkündür.

Birden fazla blok, bir anahtar veya birden fazla istisna hariç, kullanmak mümkündür. Bu istisnalar farklı istisna sınıflarını kullanabilir ve farklı hata iletilerini döndürebilir:

< ?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 = "someone@example.com";

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çıklandı:

Yukarıdaki kod, iki koşulu test eder ve koşullardan herhangi biri karşılanmadığında bir istisna atar:

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 miras alır.

ErrorMessage () işlevi oluşturuldu. Bu işlev, bir e-posta adresi geçersiz olduğunda bir hata iletisi döndürür

$ E-posta değişkeni geçerli bir e-posta adresi olan bir dizeye ayarlandı, ancak "örnek" dizesini içerir.

"Try" bloğu yürütülür ve ilk koşulda bir istisna atılmaz

İkinci koşul, e-posta "örnek" dizesini içerdiğinden bir istisna tetikler.

"Catch" bloğu istisnayı yakalar ve doğru hata mesajını görüntüler

Atılan özel durum customException sınıfındaysa ve customException yakalaması yoksa, yalnızca temel istisnası yakalanır, istisna orada ele alınır.



İstisnaları Yeniden Atma

Bazen, bir istisna atıldığında, standart yoldan farklı bir şekilde ele almak isteyebilirsiniz. Bir "catch" bloğu içinde ikinci bir istisna atmak mümkündür.

Bir betik, sistem hatalarını kullanıcılardan gizlemelidir. Sistem hataları kodlayıcı için önemli olabilir, ancak kullanıcının ilgisini çekmez. Kullanıcı için işleri kolaylaştırmak için istisnayı kullanıcı dostu bir mesajla yeniden atayabilirsiniz:

< ?php

class customException extends Exception {

public function errorMessage() {

//error message

$errorMsg = $this->getMessage().' is not a valid E-Mail address.';

return $errorMsg;

}

}

$email = "someone@example.com";

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çıklandı:

Yukarıdaki kod, e-posta adresinin "örnek" dizesini içeriyorsa test eder, eğer varsa, istisna yeniden atılır:

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 miras alır.

ErrorMessage () işlevi oluşturuldu. Bu işlev, bir e-posta adresi geçersiz olduğunda bir hata iletisi döndürür

$ E-posta değişkeni geçerli bir e-posta adresi olan bir dizeye ayarlandı, ancak "örnek" dizesini içerir.

"Try" bloğu, istisnayı yeniden atmayı mümkün kılmak için başka bir "try" bloğu içerir.

E-posta "örnek" dizesini içerdiğinden istisna tetiklenir.

"Catch" bloğu istisnayı yakalar ve "customException" ı yeniden atar.

"CustomException" yakalandı ve bir hata mesajı görüntüleniyor

Eğer istisna mevcut "try" bloğunda yakalanmazsa, "daha yüksek seviyeler" üzerinde bir catch bloğu arayacaktır.

Üst Düzey Özel Durum İşleyicisi Ayarlama

Bu set_exception_handler()işlev, yakalanmamış tüm 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 kodun çıktısı şöyle olmalıdır:

Exception: Uncaught Exception occurred

Yukarıdaki kodda "catch" bloğu yoktu. Bunun yerine, üst düzey istisna işleyici tetikledi. Bu işlev, yakalanmamış istisnaları yakalamak için kullanılmalıdır.

İstisnalar için kurallar

Kod, potansiyel istisnaların yakalanmasına yardımcı olmak için bir try bloğunda çevrelenebilir

Her deneme bloğu veya "atma" en az bir karşılık gelen yakalama bloğuna sahip olmalıdır.

Farklı istisna sınıflarını yakalamak için çoklu yakalama blokları kullanılabilir

Bir try bloğu içinde bir catch bloğuna istisnalar atılabilir (veya yeniden atılabilir).

Basit bir kural: Bir şey fırlatırsanız, onu yakalamanız gerekir.