PHP 5 یک مدل استثنا مشابه زبانهای برنامهنویسی دیگر دارد. یک استثنا میتواند throw شود و توسط ("catch") در PHP گرفته شود. کد میان علامت بلوک try استثناهای محتمل را کنترل مینماید. هر try باید حداقل یک بلوک catch مرتبط داشته باشد. بلوکهای catch چندگانه برای گرفتن کلاس استثناهای مختلف بکار میرود. اجرای معمولی (بدون استثنای ایجاد شده در بلوک try یا زمان انطباق catch که catch متناسب وجود ندارد) پس از آخرین بلوک catch ادامه خواهد یافت.استثناها میتوانند throw پرتاب شوند(یا دوباره پرتاب شوند) در یک بلوک catch گرفته خواهد شد.
وقتی یک استثنا پرتاب میشود کد بلافاصله پس از جمله اجرا نخواهد گردید و PHP تلاش خواهد نمود تا اولین انطباق catch را بیابد. اگر یک استثنا گرفته نشود خطای مرگبار PHP ایجاد خواهد شدکه پیام "Uncaught Exception ..." را نمایش میدهد مگر این که پردازشگر توسط set_exception_handler() تعیین شده باشد.
شی ایجاد شده میتواند کلاس Exception یا زیرکلاس Exception باشد. تلاش برای ایجاد شی خطای اصلی PHP ایجاد نمیکند.
Note:
توابع داخلی PHP از گزارش خطا، شیگرا مدرن از استثنا استفاده میکنند. خطا میتوان براحتی به استثنا ErrorException ترجمه شود.
Standard PHP Library (SPL) استثناهای خوبی را فراهم میکند.
Example #12 پرتاب استثنا
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
else return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo 'Hello World';
?>
The above example will output:
0.2 Caught exception: Division by zero. Hello World
Example #13 استثنا تودرتو
<?php
class MyException extends Exception { }
class Test {
public function testing() {
try {
try {
throw new MyException('foo!');
} catch (MyException $e) {
/* rethrow it */
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Test;
$foo->testing();
?>
The above example will output:
string(4) "foo!"