mirror of
https://github.com/php/doc-tr.git
synced 2026-03-23 23:02:09 +01:00
564 lines
16 KiB
XML
564 lines
16 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 7a75b854c8c52226d38397e7e8177e339fdb273f Maintainer: nilgun Status: ready -->
|
||
<!-- CREDITS: tpug, dirt, sezer -->
|
||
<chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook">
|
||
<title>İstisnalar</title>
|
||
<para>
|
||
PHP diğer programlama dillerindekine benzer bir istisna modeline
|
||
sahiptir. Bir istisna oluşturulabilir (&throw;) ve yakalanabilir (&catch;).
|
||
Olası istisnaların yakalanabilmesi için, kod bir &try; bloğu içine
|
||
alınabilir. Her &try; bloğuna karşılık en az bir tane &catch; veya
|
||
&finally; bloğu olması gerekir.
|
||
</para>
|
||
<para>
|
||
Bir istisna oluşturulursa ve geçerli işlev bağlamında &catch; bloğu yoksa,
|
||
istisna, eşleşen bir &catch; bloğu bulana kadar çağrı yığıtını çağıran
|
||
işleve "kabarcıklandırır". Yol boyunca karşılaşılan tüm &finally; blokları
|
||
çalıştırılır. Eğer çağrı yığıtı, eşleşen bir &catch; bloğu bulamadan
|
||
küresel bağlama kadar boşalırsa ve bir küresel istisna işleyici de
|
||
atanmamışsa, ölümcül hata vererek sonlanır.
|
||
</para>
|
||
<para>
|
||
Oluşturulan nesne ya bir <interfacename>Throwable</interfacename> örneği
|
||
olmalıdır. Bunu sağlamayan bir nesne oluşturmaya çalışmak (&throw;)
|
||
ölümcül bir PHP hatasına yol açmaz.
|
||
</para>
|
||
<para>
|
||
PHP 8.0.0 ve sonrasında, &throw; sözcüğü bir ifade olup herhangi bir
|
||
ifadenin içinde kullanılabilir. Önceki sürümlerde bir deyimdi ve kendi
|
||
satırına sahip olması gerekiyordu.
|
||
</para>
|
||
|
||
<sect1 annotations="chunk:false" xml:id="language.exceptions.catch">
|
||
<title><literal>catch</literal></title>
|
||
<para>
|
||
Bir &catch; bloğu oluşturulan bir istisnaya nasıl yanıt verileceğini
|
||
tanımlar. Bir &catch; bloğu işleyebileceği bir veya daha fazla istisna
|
||
veya hata türünü ve isteğe bağlı olarak istisnanın atanacağı değişkeni
|
||
tanımlar. (PHP 8.0.0 öncesinde değişken gerekliydi.) İlk &catch; bloğu,
|
||
nesneyi işleyecek &throw; nesnesinin türüyle eşleşen bir hata veya
|
||
istisnayla karşılaştığında bunları engelleyecektir.
|
||
</para>
|
||
<para>
|
||
Farklı sınıflara ait istisnaları yakalamak için birden fazla &catch; bloğu
|
||
kullanılabilir. Normal çalışma sıradaki son &catch; bloğundan sonra devam
|
||
eder. Buradaki normal çalışma (&try; bloğu içinde hiçbir istisna
|
||
oluşmadığında) sıradaki tanımlanmış son &catch; bloğundan sora devam eder.
|
||
İstisnalar bir &catch; bloğu içerisinde oluşmuş olabileceği gibi yeniden
|
||
de oluşabilir (&throw;). Aksi takdirde, çalışma, tetiklenen &catch;
|
||
bloğundan sonra devam eder.
|
||
</para>
|
||
<para>
|
||
Bir istisna oluştuğunda, istisnanın oluştuğu yerden sonraki kodlar
|
||
çalıştırılmaz ve PHP oluşan istisna ile uyuşan ilk &catch;
|
||
bloğunu bulmaya çalışır. Bir istisnanın yakalanmaması durumunda,
|
||
<function>set_exception_handler</function> işlevi ile evvelce bir istisna
|
||
eylemcisi tanımlanmamışsa, PHP bir ölümcül hata durumu oluşturur ve bir
|
||
"<literal>Uncaught Exception ...</literal>" ("Yakalanmamış istisna ...")
|
||
iletisi çıktılar.
|
||
</para>
|
||
<para>
|
||
PHP 7.1.0 ve sonrasında, boru (<literal>|</literal>) karakteri kullanarak
|
||
bir &catch; bloğunda çok sayıda istisna belirtilebilir. Farklı sınıf
|
||
hiyerarşilerindeki farklı istisnalar aynı şekilde elde edildiğinde
|
||
kullanışlıdır.
|
||
</para>
|
||
<para>
|
||
PHP 8.0.0 ve sonrasında, değişken ismi yakalama istisnası için isteğe
|
||
bağlıdır. Belirtilmezse, &catch; bloğu çalışmaya yine de devam eder fakat
|
||
istisnayı oluşturacak nesneye erişemez.
|
||
</para>
|
||
</sect1>
|
||
|
||
<sect1 annotations="chunk:false" xml:id="language.exceptions.finally">
|
||
<title><literal>finally</literal></title>
|
||
<para>
|
||
&catch; bloklarının yerine veya sonrasında bir
|
||
&finally; bloğu da belirtilebilir. Bir istisnanın oluşmamışsa bile ve
|
||
normal çalışmaya dönülmeden önce &finally; bloğu içindeki kodlar daima
|
||
&try; ve &catch; bloklarından sonra çalıştırılır.
|
||
</para>
|
||
<para>
|
||
Dikkate değer tek etkileşim, &finally; bloğu ile &return; deyimi arasında
|
||
olur. &try; veya &catch; bloklarının içinde bir &return; deyimine
|
||
rastlansa bile &finally; bloğu çalışmasına devam edeceği gibi, &return;
|
||
deyimi de çalıştırılır fakat &finally; bloğu işini bitirdikten sonra sonuç
|
||
döndürülür. Ek olarak, &finally; bloğu da bir &return; içeriyorsa
|
||
&finally; bloğundaki değer döndürülür.
|
||
</para>
|
||
</sect1>
|
||
|
||
<sect1 annotations="chunk:false" xml:id="language.exceptions.exception-handler">
|
||
<title>Küresel istisna işleyici</title>
|
||
<para>
|
||
Eğer bir istisnanın küresel bağlama kadar kabarcıklanmasına izin verilirse,
|
||
atandığı takdirde bir küresel istisna işleyici tarafından yakalanabilir.
|
||
Başka bir blok çalıştırılmazsa bir &catch; bloğu yerine çağrılmak üzere bir
|
||
işlev <function>set_exception_handler</function> işlevi ile atanabilir.
|
||
Etkisi esasen, tüm programın, &catch; olarak bu işleve sahip bir &try;-
|
||
&catch; bloğu ile sarmalanmasıyla aynıdır.
|
||
</para>
|
||
</sect1>
|
||
|
||
<sect1 annotations="chunk:false" xml:id="language.exceptions.notes">
|
||
&reftitle.notes;
|
||
<note>
|
||
<para>
|
||
Yerleşik PHP işlevleri aslında <link linkend="ini.error-reporting">hata
|
||
raporlama</link> yapmakta, istisnaları sadece <link
|
||
linkend="language.oop5">nesne yönelimli</link> güncel eklentiler
|
||
kullanmaktadır. Bununla birlikte hatalar <link
|
||
linkend="class.errorexception">ErrorException</link> ile kolayca
|
||
istisnalara dönüştürülebilir. Bununla birlikte, bu teknik sadece ölümcül
|
||
hatalarda çalışır.
|
||
</para>
|
||
<example>
|
||
<title>- Hata raporlamayı istisnalara dönüştürme örneği</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
function exceptions_error_handler($severity, $message, $filename, $lineno) {
|
||
throw new ErrorException($message, 0, $severity, $filename, $lineno);
|
||
}
|
||
|
||
set_error_handler('exceptions_error_handler');
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</note>
|
||
<tip>
|
||
<para>
|
||
<link linkend="intro.spl">Standard PHP Kütüphanesi (SPL)</link> bol bol
|
||
yerleşik istisna içerir.
|
||
</para>
|
||
</tip>
|
||
</sect1>
|
||
|
||
<sect1 annotations="chunk:false" xml:id="language.exceptions.examples">
|
||
&reftitle.examples;
|
||
<example>
|
||
<title>- Bir İstisna Oluşturmak</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
function inverse($x) {
|
||
if (!$x) {
|
||
throw new Exception('Sıfıra bölme.');
|
||
}
|
||
else return 1/$x;
|
||
}
|
||
|
||
try {
|
||
echo inverse(5) . "\n";
|
||
echo inverse(0) . "\n";
|
||
} catch (Exception $e) {
|
||
echo 'Yakalanan olağandışılık: ', $e->getMessage(), "\n";
|
||
}
|
||
|
||
// Çalışma sürer
|
||
echo 'Merhaba Dünya';
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
0.2
|
||
Yakalanan olağandışılık: Sıfıra bölme.
|
||
Merhaba Dünya
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
|
||
<example>
|
||
<title>- Bir &finally; bloğu ile istisnanın işleme sokulması</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
function inverse($x) {
|
||
if (!$x) {
|
||
throw new Exception('Sıfıra bölme.');
|
||
}
|
||
return 1/$x;
|
||
}
|
||
|
||
try {
|
||
echo inverse(5) . "\n";
|
||
} catch (Exception $e) {
|
||
echo 'İstisna yakalandı: ', $e->getMessage(), "\n";
|
||
} finally {
|
||
echo "İlk finally bloğu.\n";
|
||
}
|
||
|
||
try {
|
||
echo inverse(0) . "\n";
|
||
} catch (Exception $e) {
|
||
echo 'İstisna yakalandı: ', $e->getMessage(), "\n";
|
||
} finally {
|
||
echo "İkinci finally bloğu.\n";
|
||
}
|
||
|
||
// İcra sürer
|
||
echo "Merhaba Dünya\n";
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
0.2
|
||
İlk finally bloğu.
|
||
İstisna yakalandı: Sıfıra bölme..
|
||
İkinci finally bloğu.
|
||
Merhaba Dünya
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
<example>
|
||
<title>- &finally; bloğu ile &return; arasındaki etkileşim örneği</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
function test() {
|
||
try {
|
||
throw new Exception('foo');
|
||
} catch (Exception $e) {
|
||
return 'catch';
|
||
} finally {
|
||
return 'finally';
|
||
}
|
||
}
|
||
|
||
echo test();
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
finally
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
<example>
|
||
<title>- İç içe istisnalar</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
class MyException extends Exception { }
|
||
|
||
class Test {
|
||
public function testing() {
|
||
try {
|
||
try {
|
||
throw new MyException('foo!');
|
||
} catch (MyException $e) {
|
||
/* yeniden yakala */
|
||
throw $e;
|
||
}
|
||
} catch (Exception $e) {
|
||
var_dump($e->getMessage());
|
||
}
|
||
}
|
||
}
|
||
|
||
$foo = new Test;
|
||
$foo->testing();
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
string(4) "foo!"
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
<example>
|
||
<title>Çoklu catch istisna eldesi</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
class MyException extends Exception { }
|
||
|
||
class MyOtherException extends Exception { }
|
||
|
||
class Test {
|
||
public function testing() {
|
||
try {
|
||
throw new MyException();
|
||
} catch (MyException | MyOtherException $e) {
|
||
var_dump(get_class($e));
|
||
}
|
||
}
|
||
}
|
||
|
||
$foo = new Test;
|
||
$foo->testing();
|
||
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
&example.outputs;
|
||
<screen>
|
||
<![CDATA[
|
||
string(11) "MyException"
|
||
]]>
|
||
</screen>
|
||
</example>
|
||
<example>
|
||
<title>- Yakalama değişkeninin olmayışı</title>
|
||
<para>Sadece PHP 8.0.0 ve sonrası için geçerlidir.</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
class Özelİstisna extends Exception {}
|
||
|
||
function test() {
|
||
throw new Özelİstisna('Oopsie');
|
||
}
|
||
|
||
try {
|
||
test();
|
||
} catch (Özelİstisna) {
|
||
print "Bir Özelİstisna oluştu, fakat ayrıntılar önemsiz.";
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<example>
|
||
<title>- Bir ifade olarak throw</title>
|
||
<para>Sadece PHP 8.0.0 ve sonrası için geçerlidir.</para>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
|
||
function test() {
|
||
do_something_risky() or throw new Exception('Çalışmadı...');
|
||
}
|
||
|
||
try {
|
||
test();
|
||
} catch (Exception $e) {
|
||
print $e->getMessage();
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="language.exceptions.extending">
|
||
<title>İstisnaları Genişletmek</title>
|
||
<para>
|
||
Yerleşik <classname>Exception</classname> sınıfını genişleten kullanıcı
|
||
tanımlı bir istisna sınıfı tanımlanabilir. Aşağıdaki üyeler ve
|
||
özellikler, yerleşik <classname>Exception</classname> sınıfından
|
||
türetilen alt sınıf içerisinde nelerin erişilebilir olduğunu
|
||
göstermektedir.
|
||
</para>
|
||
<example>
|
||
<title>- Yerleşik <classname>Exception</classname> sınıfı</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
class Exception implements Throwable
|
||
{
|
||
protected $message = 'Bilinmeyen istisna'; // istisna iletisi
|
||
private $string; // __toString önbelleği
|
||
protected $code = 0; // kullanıcı tanımlı istisna kodu
|
||
protected $file; // istisnanın kaynak dosyası
|
||
protected $line; // istisnanın kaynak dosyasındaki satırı
|
||
private $trace; // geriye doğru hata izleme
|
||
private $previous; // istisnalar iç içe ise önceki istisna
|
||
|
||
|
||
|
||
public function __construct($message = '', $code = 0,
|
||
Throwable $previous = null);
|
||
|
||
|
||
final private function __clone(); // İstisna kopyalamayı engeller
|
||
final public function getMessage(); // istisna iletisi
|
||
final public function getCode(); // istisnanın kodu
|
||
final public function getFile(); // kaynak dosya
|
||
final public function getLine(); // kaynak dosya satırı
|
||
final public function getTrace(); // backtrace() dizisi
|
||
final public function getTraceAsString(); // biçemli hata izleme dizgesi
|
||
final public function getPrevious(); // önceki istisna
|
||
|
||
// Geçersiz kılınabilir //
|
||
public function __toString(); // görüntüleme için biçemlenmiş dizge
|
||
}
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
<para>
|
||
Bir sınıf yerleşik <classname>Exception</classname> sınıfını genişletiyor
|
||
ve <link linkend="language.oop5.decon">nesne kurucuyu</link> yeniden
|
||
tanımlıyorsa, mevcut tüm verinin düzgün biçimde atandığından emin olmak
|
||
için <link linkend="language.oop5.paamayim-nekudotayim"
|
||
>parent::__construct()</link> işlevinin de çağrılması hararetle önerilir.
|
||
Nesne bir karakter dizisi olarak sunulduğunda özelleştirilmiş bir çıktı
|
||
sağlayabilmek için <link linkend="language.oop5.magic"
|
||
>__toString()</link> yöntemi geçersiz kılınabilir.
|
||
</para>
|
||
<note>
|
||
<para>
|
||
İstisnaların kopyaları yapılamaz. Bir istisnanın <link
|
||
linkend="language.oop5.cloning">kopyasını</link> yapmaya çalışmak ölümcül
|
||
hatayla (<literal>E_FATAL</literal> seviyesinden bir hata) ile sonuçlanır.
|
||
</para>
|
||
</note>
|
||
<example>
|
||
<title>- <classname>Exception</classname> sınıfının genişletilmesi</title>
|
||
<programlisting role="php">
|
||
<![CDATA[
|
||
<?php
|
||
/**
|
||
* Özelleştirilmiş bir istisna sınıfı tanımlayalım
|
||
*/
|
||
class MyException extends Exception
|
||
{
|
||
// İstisnayı yeniden tanımlayalım, böylece ileti seçimlik olmaktan çıkar
|
||
public function __construct($message, $code = 0,
|
||
Throwable $previous = null) {
|
||
// biraz kod
|
||
|
||
// her şeyin düzgün atandığından emin olalım
|
||
parent::__construct($message, $code, $previous);
|
||
}
|
||
|
||
// nesnenin özelleştirilmiş karakter dizisi gösterimi
|
||
public function __toString() {
|
||
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
|
||
}
|
||
|
||
public function customFunction() {
|
||
echo "Bu türdeki istisnalar için özelleştirilmiş işlev\n";
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* İstisnayı denemek için bir sınıf oluşturalım
|
||
*/
|
||
class TestException
|
||
{
|
||
public $var;
|
||
|
||
const THROW_NONE = 0;
|
||
const THROW_CUSTOM = 1;
|
||
const THROW_DEFAULT = 2;
|
||
|
||
function __construct($avalue = self::THROW_NONE) {
|
||
|
||
switch ($avalue) {
|
||
case self::THROW_CUSTOM:
|
||
// özelleştirilmiş istisna oluştur
|
||
throw new MyException('1 geçersiz bir bağımsız değişkendir', 5);
|
||
break;
|
||
|
||
case self::THROW_DEFAULT:
|
||
// öntanımlı olarak bir oluşturulur.
|
||
throw new Exception('2 geçerli bir bağımsız değişken değildir', 6);
|
||
break;
|
||
|
||
default:
|
||
// İstisna yok; nesne oluşturulacak.
|
||
$this->var = $avalue;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// Örnek 1
|
||
try {
|
||
$o = new TestException(TestException::THROW_CUSTOM);
|
||
} catch (MyException $e) { // Yakalanacaktır
|
||
echo "Benim istisnam yakalandı\n", $e;
|
||
$e->customFunction();
|
||
} catch (Exception $e) { // Bu atlanır
|
||
echo "Öntanımlı istisna yakalandı\n", $e;
|
||
}
|
||
|
||
// Çalışmaya devam et
|
||
var_dump($o); // Null
|
||
echo "\n\n";
|
||
|
||
|
||
// Örnek 2
|
||
try {
|
||
$o = new TestException(TestException::THROW_DEFAULT);
|
||
} catch (MyException $e) { // Bu tür ile uyuşmuyor
|
||
echo "Benim istisnam yakalandı\n", $e;
|
||
$e->customFunction();
|
||
} catch (Exception $e) { // Bu yakalanacaktır
|
||
echo "Öntanımlı istisna yakalandı\n", $e;
|
||
}
|
||
|
||
// Çalışmaya devam et
|
||
var_dump($o); // Null
|
||
echo "\n\n";
|
||
|
||
|
||
// Örnek 3
|
||
try {
|
||
$o = new TestException(TestException::THROW_CUSTOM);
|
||
} catch (Exception $e) { // Yakalanacaktır
|
||
echo "Öntanımlı İstisna yakalandı\n", $e;
|
||
}
|
||
|
||
// Çalışmaya devam et
|
||
var_dump($o); // Null
|
||
echo "\n\n";
|
||
|
||
|
||
// Örnek 4
|
||
try {
|
||
$o = new TestException();
|
||
} catch (Exception $e) { // Bu atlandır; istisna yok
|
||
echo "Öntanımlı İstisna yakalandı\n", $e;
|
||
}
|
||
|
||
// Çalışmaya devam et
|
||
var_dump($o); // TestException
|
||
echo "\n\n";
|
||
?>
|
||
]]>
|
||
</programlisting>
|
||
</example>
|
||
</sect1>
|
||
|
||
</chapter>
|
||
|
||
<!-- Keep this comment at the end of the file
|
||
Local variables:
|
||
mode: sgml
|
||
sgml-omittag:t
|
||
sgml-shorttag:t
|
||
sgml-minimize-attributes:nil
|
||
sgml-always-quote-attributes:t
|
||
sgml-indent-step:1
|
||
sgml-indent-data:t
|
||
indent-tabs-mode:nil
|
||
sgml-parent-document:nil
|
||
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
||
sgml-exposed-tags:nil
|
||
sgml-local-catalogs:nil
|
||
sgml-local-ecat-files:nil
|
||
End:
|
||
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||
vim: et tw=78 syn=sgml
|
||
vi: ts=1 sw=1
|
||
-->
|