PHP 5.5 ve Try / Catch / Finally

Standard

Selam arkadaşlar, bol bol okumaya ve öğrenmeye devam ediyoruz.

PHP 5.5 ile gelen bir başka yenilikte sıra; Finally kavramı..

Bundan 2 önceki makalemde size sınıf ve metodlar için final kavramından bahsetmiştim, onlar ile karıştırmayın.. Bu Try & Cache ailesine katılan küçük kardeş. Artık ekip üçledi…

İşin özü finally bizim için nolursa olsun işle bunu yap anlamına çıkıyor.
(S.S. yapılacak.. seve seve… yani bi şekilde yap )

Bu sefer fazla geyik yaptık belki kafanız biraz bulandı ama örnekler ile toparlanacak kafanızda olay, o yüzden lafı çok uzatmadan konuya gireceğim hatta çok güzel anlatımın yapıldığı bir yazı üzerinden gideceğim. Hemen örnek vermek istiyorum;

<?php
 
try { 
  print "deneyelim\n";
  throw new Exception();
} catch (Exception $e) {
  print "hata oldu\n";
} finally {
  print "Ben kralım hep çalışırım\n";
}
 
/* Output:
deneyelim
hata oldu
Ben kralım hep çalışırım
*/

Aslında bu örnek yeterli anlamak için, kısa ve öz ama bir kaç örnek daha vererek hem detaylandırmak hemde pekiştirmek istiyorum…

Şimdi genel exception kullanımı yerine biraz daha özelleştirelim durumu:

<?php
 
// Runtime Exception aşağıdaki catch-blokları tarafından yakalanmaz
try { 
  print "deneyelim\n";
  throw new RuntimeException();
} catch (LogicException $e) {
  print "hata logic ex \n";
} catch (BadMethodCallException $e) {
  print "hata bad method call\n";
} finally {
  print "Ben kralım hep çalışırım\n";
}
 
/* Output:
deneyelim
Ben kralım hep çalışırım
 
Fatal error: Uncaught exception 'RuntimeException' in finally.php:6
Stack trace:
#0 {main}
  thrown in finally.php on line 6
*/

Görüldüğü gibi runtimeexception yakalamadığımız için hata döndürdü bize…

Peki birde finally işlemini fonksiyon içinde yapalım, o zaman hangi sıra ile nasıl dönecek bakalım:

<?php
 
function onur() {
  try { 
    echo "Deneyelim\n";
    throw new RuntimeException("lann!");
  } catch (LogicException $e) {
    echo "Exception: " . $e->getMessage() . "\n";
  } finally {
    print "İçteki finally!\n";
  }
}
 
try {
  onur();
} catch (RuntimeException $e) {
  echo "dıştaki exception: " . $e->getMessage() . "\n";
} finally {
  echo "Dıştaki finally\n";
}
 
/* Output:
Deneyelim
İçteki finally!
dıştaki exception: lann!
Dıştaki finally
*/

Fonksiyon içinde değer döndürürken davranışları nasıl peki? Bakalım görelim..

<?php
function foobar() {
  try {  
    $a = 42;
    return $a;
  } catch (Exception $e) {
    print "Exception!\n";
  } finally {
    print "Finally!\n";
  }
  
  return -1;
}
 
print foobar() . "\n";
 
/* Output:
Finally!
42
*/

Giderek örneklerimizi zorlaştıralım;

<?php
function foobar() {
  try {
    throw new Exception();
    return 1;
  } catch (Exception $e) {
    print "Exception!\n";
    return 2;
  } finally {
    print "Finally!\n";
    return 3;
  }
 
  return -1;
}
 
print foobar() . "\n";
 
/* Output:
Exception!
Finally!
3
*/

Gördüğünüz gibi yukardada her daim hatayı yakalayıp mesajını yazdırsa bile en son final bloğuna girmekte…

Kapanışı çoklu fonksiyonlar ile yapmak istiyorum

<?php
function bar1() {
  print "bar1\n";
  return 1;
}
 
function bar2() {
  print "bar2\n";
  return 2;
}
function bar3() {
  print "bar3\n";
  return 3;
}
 
function foobar() {
  try {
    throw new Exception();
    return bar1();
  } catch (Exception $e) {
    print "Exception!\n";
    return bar2();
  } finally {
    print "Finally!\n";
    return bar3();
  }
  
  return -1;
}
 
print foobar() . "\n";
 
/* Output:
Exception!
bar2
Finally!
bar3
3
*/

Açıklayıcı olmuştur umarım, olmadıysa da daha uğraşmayın derim 🙂

Kaynakça: adayinthelifeof

Herkese iyi çalışmalar..

2 thoughts on “PHP 5.5 ve Try / Catch / Finally

  1. Süleyman

    selam
    try {
    throw new Exception();
    return 1;
    } catch (Exception $e) {
    print “Exception!\n”;
    return 2;
    } finally {
    print “Finally!\n”;
    return 3;
    }
    try blogu icinde throw new Exception(); neden ihtiyac var ?

    • Onur Canalp

      Süreci ve tüm adımları tek tek görmeniz için 🙂
      Yoksa normalde gerek yok böyle bir şeye… Tek tek tüm adımlara girmesini istedim uygulamanın…

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir