PHP Try Catch Örneği: İstisna ve Hata İşleme Eğitimi

İstisna nedir?

Hata, programın kendisi tarafından ele alınamayan beklenmeyen bir program sonucudur.

Program düzeltilerek hatalar giderilir. Bir hata örneği, çalışmayı asla durdurmayan sonsuz bir döngü olabilir.

Bunun bir istisnası, programın kendisi tarafından halledilebilen beklenmeyen program sonucudur.

İstisna örnekleri arasında var olmayan bir dosyayı açmaya çalışmak yer alır.

Bu istisna, dosya oluşturularak veya kullanıcıya dosyayı arama seçeneği sunularak işlenebilir.

Neden istisnayı ele almalısınız?

  • Sayfalarımızda son kullanıcılarımızı çok sinirlendirebilecek veya rahatsız edebilecek beklenmedik sonuçlardan kaçının
  • Kötü niyetli kullanıcıların uygulamalarımıza saldırmak için kullanabileceği bilgileri açığa çıkarmayarak uygulamalarımızın güvenliğini artırın
  • Php İstisnaları, öngörülebilir bir hata meydana gelirse programın normal akışını değiştirmek için kullanılır.

PHP Hata işleme

Yapılandırma ayarlarınıza bağlı olarak bir hata oluştuğunda, PHP Web tarayıcısında, meydana gelen hatayla ilgili bilgilerle birlikte hata mesajını görüntüler.

PHP hataları işlemek için çeşitli yollar sunar.

Yaygın olarak kullanılan üç (3) yönteme bakacağız;

  1. Kalıp ifadeleri– kalıp işlevi yankı ve çıkış işlevini bir arada birleştirir. Bir hata oluştuğunda bir mesajın çıktısını almak ve betiğin yürütülmesini durdurmak istediğimizde çok kullanışlıdır.
  2. Özel hata işleyicileri – bunlar, bir hata oluştuğunda çağrılan kullanıcı tanımlı işlevlerdir.
  3. PHP hata raporlaması – PHP hata raporlama ayarlarınıza bağlı olarak hata mesajı. Bu yöntem, hataya neyin sebep olduğu hakkında hiçbir fikriniz olmadığında geliştirme ortamında çok kullanışlıdır. Görüntülenen bilgiler uygulamanızdaki hataları ayıklamanıza yardımcı olabilir.

Hata işleme örnekleri

Şimdi hata işleme rutinleriyle ilgili bazı basit örneklere bakalım.

Veri depolamak için metin dosyalarını kullanan bir uygulama geliştirdiğimizi varsayalım. Dosyadan veri okumayı denemeden önce dosyanın varlığını kontrol etmek isteyebiliriz.

Aşağıdaki kod yukarıdaki örneği uygular.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Simple_error.php dosyasını phptuts klasörüne kaydettiğinizi varsayarak URL'yi açın. http://localhost/phptuts/simple_error.php

Aşağıdaki sonuçları elde edeceksiniz

PHP Hata işleme

Yukarıdaki sonuçlardan da görebileceğiniz gibi, uygulamamızın profesyonellikten uzak görünmesine neden olur ve kullanıcıyı rahatsız edebilir.

Yukarıdaki kodu değiştireceğiz ve uygulama için bir hata işleyici yazacağız.

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

Yukarıdaki kodu error_handling.php olarak kaydettiğinizi varsayarak URL'yi açın. http://localhost/phptuts/error_handling.php

PHP'de PHP İstisna Kolu

Not: “Dosya bulunamadı” gibi bir mesaj göstermek yerine yukarıda gösterildiği gibi bir mesaj göstermek iyi bir güvenlik uygulamasıdır.

Özel bir hata işleyici kullanan başka bir örneğe bakalım.

Özel hata işleyici, varsayılan PHP hata işleme işlevi olarak ayarlanacak ve temel olarak bir hata numarası ve mesajı görüntüleyecektir.

Aşağıdaki kod yukarıdaki örneğin uygulanmasını göstermektedir

<?php
function my_error_handler($error_no, $error_msg)
{
    echo "Opps, something went wrong:";
    echo "Error number: [$error_no]";
    echo "Error Description: [$error_msg]";
}
set_error_handler("my_error_handler");
echo (5 / 0);
?>

URL'yi aç http://localhost/phptuts/custom_error_handler.php Aşağıdaki sonuçları alacaksınız

. PHP Hata işleme


Yukarıdaki örnekte görebileceğiniz gibi, özel hata işleyiciler şu anlamda güçlüdür:

  • Hata mesajlarını özelleştirmemize izin veriyorlar.
  • Özel hata işleyicisi ayrıca bir dosyaya/veritabanına hata kaydı tutma, geliştiriciye e-posta gönderme vb. işlevleri de içerebilir.

Şimdi üçüncü hata işleme türüne bakalım. PHP'nin yerleşik işlevi error_reporting işlevini kullanacağız. Aşağıdaki temel söz dizimine sahiptir

<?php
error_reporting($reporting_level);
?>

İŞTE,

  • “error_reporting” PHP hata raporlama fonksiyonudur
  • “$reporting_level” isteğe bağlıdır ve raporlama düzeyini ayarlamak için kullanılabilir. Herhangi bir raporlama düzeyi belirtilmemişse, PHP, php.ini dosyasında belirtilen varsayılan hata raporlama düzeyini kullanacaktır.
Raporlama Düzeyi Açıklama Örnek E-posta
E_UYARI Yalnızca uyarı mesajlarını görüntüler. Komut dosyasının yürütülmesini durdurmaz error_reporting(E_WARNING);
E_BİLDİRİM Bir programın normal yürütülmesi sırasında oluşabilecek veya bir hata olabilecek bildirimleri görüntüler. error_reporting(E_ NOTICE);
E_USER_ERROR Kullanıcı tarafından oluşturulan hataları, yani özel hata işleyicisini görüntüler error_reporting(E_ USER_ERROR);
E_USER_WARNING Kullanıcı tarafından oluşturulan uyarı mesajlarını görüntüler error_reporting(E_USER_WARNING);
E_USER_NOTICE Kullanıcı tarafından oluşturulan bildirimleri görüntüler error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR Önemli olmayan ve özel hata işleyicileri kullanılarak çözülebilecek hataları görüntüler error_reporting(E_RECOVERABLE_ERROR);
E_ALL Tüm hataları ve uyarıları görüntüler error_reporting(E_ ALL);

Hatalar ve İstisna Arasındaki Fark

  • Hatalar genellikle düzeltilemezken istisnalar atılır ve yakalanması amaçlanır.
  • İstisnalar nesne yönelimli bir şekilde işlenir. Yani bir istisna atıldığında; istisna ayrıntılarını içeren bir istisna nesnesi oluşturulur.

Aşağıdaki tablo istisna nesnesi yöntemlerini göstermektedir

Yöntem Açıklama Örnek E-posta
getMessage () İstisnanın mesajını görüntüler
<?php
echo $e->getMessage();
?>
getCode() İstisnayı temsil eden sayısal kodu görüntüler
<?php
echo $e->getCode();
?>
dosyayı al() İstisnanın oluştuğu dosya adını ve yolunu görüntüler
<?php
echo $e->getFile();
?>
hat almak() İstisnanın oluştuğu satır numarasını görüntüler
<?php
echo $e->getLine();
?>
getTrace() İstisnadan önceki geri izleme dizisini görüntüler
<?php
print_r( $e->getTrace());
?>
getÖnceki() Geçerli istisnadan önceki önceki istisnayı görüntüler
<?php
echo $e->getPrevious();
?>
getTraceAsString() İstisnanın geriye dönük izini dizi yerine dize olarak görüntüler
<?php
echo $e->getTraceAsString();
?>
__toString() İstisnanın tamamını bir dize olarak görüntüler
<?php
echo $e->__toString();
?>


Aşağıda bir istisna fırlatmanın temel sözdizimi gösterilmektedir.

<?php
throw new Exception("This is an exception example");
?>

İŞTE,

  • “throw” istisnayı atmak için kullanılan anahtar kelimedir
  • “yeni İstisna(…)” bir istisna nesnesi oluşturur ve mesaj parametresi olarak “Bu bir istisna örneğidir” dizesini iletir.

Yukarıdaki kod aşağıdaki mesajı çıktı olarak verir.

PHP'de PHP İstisna Kolu

Şimdi throw ve catch istisnalarını uygulayan bir örneğe bakacağız.

Yukarıdaki örneği değiştireceğiz ve deneme, fırlatma ve yakalamayı dahil edeceğiz.

Aşağıdaki temel söz dizimine sahiptir.

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

İŞTE,

  • “try{…}”, potansiyel olarak bir istisna oluşturabilecek, yürütülecek kod bloğudur
  • “catch(Exception $e){…}”, atılan istisnayı yakalayan ve istisna nesnesini $e değişkenine atayan kod bloğudur.

Aşağıdaki kod, try, throw ve catch istisnasının uygulandığı temel istisna örneğini gösterir.

Program kasıtlı olarak daha sonra yakalayacağı bir istisna atar.

<?php
try {
    $var_msg = "This is an exception example";
    throw new Exception($var_msg);
}
catch (Exception $e) {
    echo "Message: " . $e->getMessage();
    echo "";
    echo "getCode(): " . $e->getCode();
    echo "";
    echo "__toString(): " . $e->__toString();
}
?>

URL'yi aç http://localhost/phptuts/exception_handling.php Aşağıdaki sonuçları elde edeceksiniz.

PHP'de PHP İstisna Kolu

Atılan istisnanın türüne bağlı olarak bir php try ifadesi için birden fazla istisna oluşturmak da mümkündür.

Şununla ilgili makaleye bakın: MySQL, PHP veri erişimi… birden fazla istisnanın uygulama örnekleri için

Çoklu İstisnalar

Çoklu istisna, atılan istisnaları işlemek için birden fazla try catch bloğu kullanır. Birden fazla istisna şu durumlarda faydalıdır;

  • Atılan istisnaya bağlı olarak özelleştirilmiş bir mesaj görüntülemek istiyorsunuz
  • Atılan istisnaya bağlı olarak benzersiz bir işlem gerçekleştirmek istiyorsunuz

Aşağıdaki akış şeması birden fazla istisnanın nasıl çalıştığını göstermektedir

Çoklu İstisnalar

Birden çok istisna kullanan bir örneğe bakalım.

Bir sayıyı paydaya bölen kodu değiştireceğiz.

İki tür istisnanın oluşmasını bekliyoruz;

  • Sıfıra bölüm
  • Negatif bir sayıya bölme

Basitlik açısından, catch bloklarımızda yalnızca istisna türünü göstereceğiz.

İstisna sınıfında yerleşik olan PHP, istisnalar atmak için kullanılır.

İstisna sınıfını genişleten iki sınıf oluşturacağız ve bunları istisna atmak için kullanacağız.

Aşağıdaki kod uygulamayı göstermektedir.

<?php
class DivideByZeroException extends Exception {};
class DivideByNegativeException extends Exception {};
function process($denominator)
{
	try
	{
		if ($denominator == 0)
		{
			throw new DivideByZeroException();
		}
		else if ($denominator < 0)
		{
			throw new DivideByNegativeException();
		}
		else
		{
			echo 25 / $denominator;
		}
	}
	catch (DivideByZeroException $ex)
	{
		echo "DIVIDE BY ZERO EXCEPTION!";
	}
	catch (DivideByNegativeException $ex)
	{
		echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!";
	}
	catch (Exception $x)
	{
	echo "UNKNOWN EXCEPTION!";
	}
}
process(0);
?>

Kodu test etme

multiple_ Exceptions.php dosyasını phptuts klasörüne kaydettiğinizi varsayacağız.

URL'ye göz atın http://localhost/phptuts/multiple_exceptions.php

PHP'de PHP İstisna Kolu

PHP dosyasına geri dönün ve aşağıdaki diyagramda gösterildiği gibi parametre olarak -1'i geçirin.

PHP'de PHP İstisna Kolu

URL'ye göz atın http://localhost/phptuts/multiple_exceptions.php.

Hangi sonuçları alıyorsunuz? Parametre olarak 3'ü iletin.

Hangi sonuçları alıyorsunuz?

ÖZET

  • Hatalar PHP kodunun ürettiği beklenmeyen sonuçlardır
  • Hata işleme uygulama performansını artırır
  • PHP, PHP'nin hataları raporlama biçimini özelleştirmek için kullanılabilecek yerleşik işlevlere sahiptir
  • İstisnalar hatalar gibidir ancak atıldığında catch bloğu kullanılarak yakalanabilirler.
  • Hata bilgilerini gösteren hata mesajlarının görüntülenmesi kötü bir güvenlik uygulaması olarak kabul edilir.