romegames 1
romegames
Krutzo 1
Krutzo
shrpnl 1
shrpnl
Best Studio 1
Best Studio
D 1
delimuratt
Aliyldrim 1
Aliyldrim
Mt2Hizmet 1
Mt2Hizmet
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

PHP - Hata İşleme

Carissa

Administrator
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye Turkmmo Discord Nitro Booster
Admin
VIP Üye
Katılım
2 Mar 2015
Konular
59,189
Mesajlar
88,439
Çözüm
109
Online süresi
4mo 16d
Reaksiyon Skoru
14,280
Altın Konu
2,398
TM Yaşı
11 Yıl 3 Ay 6 Gün
Başarım Puanı
1,051
MmoLira
695,092
DevLira
234
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

cats.jpg



PHP'de hata işleme, PHP kodunda programın karşılaşabileceği çalışma zamanı hatalarını etkili bir şekilde tanımlamak ve bunlardan kurtulmak için bir düzenleme yapmak anlamına gelir. PHP'de hatalar − yardımıyla işlenir.

  • die() fonksiyonu
  • Hata İşleyici İşlevi

die() Fonksiyonu

die() fonksiyonu PHP'de exit()'in bir takma adıdır. Her ikisi de karşılaşıldığında geçerli PHP betiğinin sonlandırılmasıyla sonuçlanır. Parantez içinde belirtilirse isteğe bağlı bir dize, program sonlandırılmadan önce çıktı olarak verilir.

die("message");

Örnek

Aşağıdaki kod, bir PHP betiğinde die()'nin tipik bir kullanımıdır. PHP bir dosya bulamazsa Dosya bulunamadı mesajını görüntüler, aksi takdirde sonraki işleme için dosyayı açar.


PHP:
<?php
   if(!file_exists("nosuchfile.txt")) {
      die("File not found");
   } else {
      $file = fopen("nosuchfile","r");
      print "Opend file sucessfully";
      
      // Rest of the code here.
      fclose($file);
   }
?>

Aşağıdaki çıktıyı üretecektir:

File not found

Yukarıdaki tekniği kullanarak, programınızda hata oluştuğunda onu durdurabilir ve PHP'nin ölümcül hata mesajları üretmesine izin vermek yerine, daha anlamlı ve kullanıcı dostu mesajlar görüntüleyebilirsiniz.


Hata İşleyici İşlevi

Hata işleme için die() kullanmak çirkin ve kötü bir program tasarımı olarak kabul edilir, çünkü site kullanıcıları için çirkin bir deneyime neden olur. PHP, özel bir fonksiyon tanımlayıp hataları işlemek için aday gösterebileceğiniz daha zarif bir alternatif sunar.

set_error_handler() fonksiyonunun aşağıdaki parametreleri vardır:

set_error_handler(?callable $callback, int $error_levels = E_ALL): ?callable

İlk parametre, bir hatayla karşılaşıldığında otomatik olarak çağrılan kullanıcı tanımlı bir fonksiyondur.

Özel hata işleyici geri çağırma işlevi aşağıdaki parametrelere sahip olmalıdır:

handler(
int $errno,
string $errstr,
string $errfile = ?,
int $errline = ?,
array $errcontext = ?
): bool

Parametreler


ParametreÖnemiTanım
errnoGerekliKullanıcı tanımlı hata için hata seviyesini belirtir. Sayısal değer olmalıdır.
errstrGerekliKullanıcının tanımladığı hataya ait hata mesajını belirtir.
errfileİsteğe bağlıHatanın oluştuğu dosyanın adını belirtir.
errlineİsteğe bağlıHatanın oluştuğu satır numarasını belirtir.
errcontextİsteğe bağlıHata oluştuğunda kullanımda olan değişkenleri ve değerlerini içeren bir dizi belirtir.

Geri çağırma fonksiyonu false döndürürse varsayılan hata çağrılacaktır.

$ errno, önceden tanımlanmış hata seviyelerine karşılık gelen bir tam sayıdır.

Sr.NoSabit ve AçıklamaDeğer
1E_ERROR (int)
Kurtarılamayan ölümcül çalışma zamanı hataları. Komut dosyasının yürütülmesi durduruldu.
1
2E_WARNING (int)
Çalışma zamanı uyarıları (ölümcül olmayan hatalar). Komut dosyasının yürütülmesi durdurulmaz.
2
3E_PARSE (int)
Derleme zamanı ayrıştırma hataları. Ayrıştırma hataları yalnızca ayrıştırıcı tarafından oluşturulmalıdır.
4
4E_NOTICE (int)
Çalışma zamanı bildirimleri. Bir hatayı gösterebilecek, ancak bir betiğin normal çalışması sırasında da gerçekleşebilecek bir şey.
8
5E_CORE_ERROR (int)
PHP'nin ilk başlatılması sırasında oluşan ölümcül hatalar. Bu bir E_ERROR'a benzer.
16
6E_CORE_WARNING (int)
Warnings (non-fatal errors) that occur during PHP's initial startup. This is like an E_WARNING,
32
7E_COMPILE_ERROR (int)
PHP'nin ilk başlatılması sırasında oluşan uyarılar (ölümcül olmayan hatalar). Bu bir E_WARNING gibidir.
64
8E_COMPILE_WARNING (int)
Ölümcül derleme zamanı hataları. Bu bir E_ERROR gibidir.
128
9E_USER_ERROR (int)
Derleme zamanı uyarıları (ölümcül olmayan hatalar). Bu bir E_WARNING gibidir.
256
10E_USER_WARNING (int)
Kullanıcı tarafından oluşturulan hata mesajı. Bu , PHP kodunda PHP fonksiyonu trigger_error() kullanılarak oluşturulan bir E_ERROR'a benzer.
512
11E_USER_NOTICE (int)
Kullanıcı tarafından oluşturulan bildirim mesajı. Bu , PHP kodunda trigger_error() fonksiyonu kullanılarak oluşturulan bir E_NOTICE'e benzer.
1024
12E_STRICT (int)
Kodunuzun en iyi şekilde birlikte çalışmasını ve ileriye dönük uyumluluğunu garanti altına almak için PHP'nin kodunuzda değişiklikler önermesini etkinleştirin.
2048
13E_RECOVERABLE_ERROR (int)
Yakalanabilir ölümcül hata. Hata kullanıcı tanımlı bir işleyici tarafından yakalanmazsa, uygulama bir E_ERROR olduğu için sonlandırılır.
4096
14E_DEPRECATED (int)
Çalışma zamanı bildirimleri. Gelecekteki sürümlerde çalışmayacak kod hakkında uyarılar almak için bunu etkinleştirin.
8192
15E_USER_DEPRECATED (int)
Kullanıcı tarafından oluşturulan uyarı mesajı. Bu , PHP kodunda trigger_error() fonksiyonu kullanılarak oluşturulan bir E_DEPRECATED gibidir.
16384
16E_ALL (int)
Tüm hatalar, uyarılar ve bildirimler.
32767

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   error_reporting(E_ERROR);

   function myerrorhandler($errno, $errstr) {
      echo "error No: $errno Error message: $errstr" . PHP_EOL;
      echo "Terminating PHP script";
      die();
   }

   set_error_handler("myerrorhandler");

   $f = fopen("nosuchfile.txt", "r");
   echo "file opened successfully";
   // rest of the code
   fclose($f);
?>

Aşağıdaki çıktıyı üretecektir:

error No: 2 Error message: fopen(nosuchfile.txt): Failed to open stream: No
such file or directory
Terminating PHP script

PHP'nin hata sınıfı hiyerarşisi atılabilir arayüzden başlar. PHP'deki tüm önceden tanımlanmış Hata sınıfları Hata sınıfından miras alınır.

ArithmeticError Sınıfı

ArithmeticError sınıfı Error sınıfından miras alınmıştır. Bu tür hatalar negatif miktarda bitsel kaydırma işlemi gibi belirli matematiksel işlemleri gerçekleştirirken oluşabilir.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   try {
      $a = 10;
      $b = -3;
      $result = $a << $b;
   }
   catch (ArithmeticError $e) {
      echo $e->getMessage();
   }
?>

Aşağıdaki çıktıyı üretecektir:

Bit shift by negative number

Bu hata, intdiv() fonksiyonuna yapılan çağrının, tam sayının meşru sınırlarının ötesinde bir değerle sonuçlanması durumunda da oluşur.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   try {
      $a = PHP_INT_MIN;
      $b = -1;
      $result = intdiv($a, $b);
      echo $result;
   }
   catch (ArithmeticError $e) {
      echo $e->getMessage();
   }
?>

Aşağıdaki çıktıyı üretecektir:

Division of PHP_INT_MIN by -1 is not an integer


DivisionByZeroError

DivisionByZeroError sınıfı ArithmeticError sınıfının bir alt sınıfıdır. Bu tür hata, bölme işleminde paydanın değeri sıfır olduğunda oluşur.

Örnek: Modulo by Zero

Aşağıdaki örneğe bir göz atın:

PHP:
<?php
   try {
      $a = 10;
      $b = 0;
      $result = $a%$b;
      echo $result;
   }
   catch (DivisionByZeroError $e) {
      echo $e->getMessage();
   }
?>

Aşağıdaki çıktıyı üretecektir:

Modulo by zero

Bu durum, bir modül operatörünün (%) ikinci operatörü 0 olduğunda ve intdiv() fonksiyonunun ikinci argümanı 0 olduğunda da meydana gelebilir.

Örnek: Sıfıra Bölme

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   try {
      $a = 10;
      $b = 0;
      $result = $a/$b;
      echo $result;
   }
   catch (DivisionByZeroError $e) {
      echo $e->getMessage();
   }
?>

Aşağıdaki çıktıyı üretecektir:
Division by zero

ArgumentCountError

PHP ayrıştırıcısı, kullanıcı tarafından tanımlanan bir fonksiyona veya yönteme geçirilen argümanlar, tanımındakilerden az olduğunda ArgumentCountError hatası verir.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   function add($x, $y) {
      return $x+$y;
   }
   try {
      echo add(10);
   }
   catch (ArgumentCountError $e) {
      echo $e->getMessage();
   }
?>

Aşağıdaki çıktıyı üretecektir:
Too few arguments to function add(), 1 passed in C:\xampp\php\test.php on line 9 and exactly 2 expected

Tür Hatası

Bu hata, gerçek ve resmi argüman tipleri eşleşmediğinde, dönüş tipi beyan edilen döndürülen tiple uyuşmadığında ortaya çıkar.

Örnek

Aşağıdaki örneğe bir göz atın.


PHP:
<?php
   function add(int $first, int $second) {
      echo "addition: " . $first + second;
   }

   try {
      add('first', 'second');
   }
   catch (TypeError $e) {
      echo $e->getMessage(), "";
   }
?>

Aşağıdaki çıktıyı üretecektir:

add(): Argument #1 ($first) must be of type int, string given,
called in /home/cg/root/63814/main.php on line 7

TypeError, PHP'nin yerleşik işlevine yanlış sayıda argüman geçirildiğinde de fırlatılır. Ancak, "strict_types=1" yönergesi başlangıçta ayarlanmalıdır.

Örnek

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   declare(strict_types=1);
   try {
      echo pow(100,2,3);
   }
   catch (TypeError $e) {
      echo $e->getMessage(), "";
   }
?>

Aşağıdaki çıktıyı üretecektir :

pow() expects exactly 2 parameters, 3 given

PHP'de İstisnaların İşlenmesi

PHP'nin diğer programlama dillerine benzer bir istisna modeli vardır. İstisnalar önemlidir ve hata işleme üzerinde daha iyi bir kontrol sağlar.

İstisnalarla ilgili yeni anahtar kelimeyi açıklayalım.

  • Try − Bir istisna kullanan bir fonksiyon bir "try" bloğunda olmalıdır. İstisna tetiklenmezse, kod normal şekilde devam edecektir. Ancak istisna tetiklenirse, bir istisna "atılır".
  • Throw − Bu, bir istisnayı nasıl tetiklediğinizdir. Her "throw" en az bir "catch"e sahip olmalıdır.
  • Catch − Bir "catch" bloğu bir istisnayı alır ve istisna bilgisini içeren bir nesne oluşturur.
Bir istisna atıldığında, ifadeyi takip eden kod yürütülmeyecek ve PHP ilk eşleşen yakalama bloğunu bulmaya çalışacaktır. Bir istisna yakalanmazsa, "Yakalanmamış İstisna ..." ile bir PHP Ölümcül Hatası verilecektir.

  • Bir istisna atılabilir ve PHP içinde yakalanabilir ("yakalandı"). Kod bir try bloğunun içine alınabilir.
  • Her denemenin en az bir tane karşılık gelen catch bloğu olmalıdır. Farklı istisna sınıflarını yakalamak için birden fazla catch bloğu kullanılabilir.
  • İstisnalar bir catch bloğu içerisinde atılabilir (veya tekrar atılabilir).

Örnek

Aşağıda kod parçası bulunmaktadır, bu kodu kopyalayıp bir dosyaya yapıştırın ve sonucu kontrol edin.

PHP:
<?php
   try {
      $error = 'Always throw this error';
      throw new Exception($error);
      
      // Code following an exception is not executed.
      echo 'Never executed';
   }catch (Exception $e) {
      echo 'Caught exception: ',  $e->getMessage(), "";
   }
  
   // Continue execution
   echo 'Hello World';
?>

Yukarıdaki örnekte $e->getMessage fonksiyonu hata mesajını almak için kullanılır. Exception sınıfından kullanılabilecek aşağıdaki fonksiyonlar vardır.

  • getMessage() − istisna mesajı
  • getCode() − istisna kodu
  • getFile() − kaynak dosya adı
  • getLine() − kaynak satırı
  • getTrace() − backtrace()'in n dizisi
  • getTraceAsString() − iz biçimlendirilmiş dizesi

Özel İstisna İşleyicisi Oluşturma

Kendi özel istisna işleyicinizi tanımlayabilirsiniz. Kullanıcı tanımlı bir istisna işleyici işlevi ayarlamak için aşağıdaki işlevi kullanın.

string set_exception_handler ( callback $exception_handler )

Burada exception_handler, yakalanmamış bir istisna oluştuğunda çağrılacak fonksiyonun adıdır. Bu fonksiyon, set_exception_handler() çağrılmadan önce tanımlanmalıdır.

Örnek​

Aşağıdaki örneğe bir göz atın.

PHP:
<?php
   function exception_handler($exception) {
      echo "Uncaught exception: " , $exception->getMessage(), "\n";
   }
    
   set_exception_handler('exception_handler');
   throw new Exception('Uncaught Exception');
  
   echo "Not Executed";
?>
 

Bire bir çeviri, reddedildi.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst