ایجاد یک کلاس استثنای سفارشی
برای ایجاد یک handler جداگانه سفارشی، باید یک کلاس خاص دارای توابعی باشد که هنگام رخ دادن یک استثنا در PHP فراخوانی شود. کلاس شما باید یک توسعه از کلاس استثنا باشد.
کلاس استثنای سفارشی، خواص را از کلاس استثنائی پی اچ پی به ارث برده و می توانید توابع سفارشی را به آن اضافه کنید.
اجازه دهید یک کلاس استثنا ایجاد کنیم:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example...com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
کلاس جدید یک نسخه از کلاس استثنای قدیمی (اصلی پی اچ پی)با افزودن تابع errorMessage است. از آنجا که یک کپی از کلاس قدیمی است و خواص و روش ها را از کلاس قدیمی به ارث می برد، می توانیم از متدهای کلاس استثنا مانند getLine و getFile و getMessage استفاده کنیم.
توضیح مثال فوق:
کد بالا یک استثناء را با یک کلاس استثنائی سفارشی استفاده می کند:
- کلاس customException به عنوان یک توسعه از کلاس استثنای قدیمی ایجاد می شود. به این ترتیب تمام متدها و خواص را از کلاس استثنای قدیمی به ارث می برد.
- همپنین تابع errorMessage در داخل کلاس ایجاد می شود که اگر یک آدرس ایمیل نامعتبر باشد،، یک پیام خطا را نشان دهد.
- متغیر email ، با یک رشته مقداردهی می شود که یک آدرس ایمیل معتبر نیست.
- بلوک “try” اجرا می شود و از آنجا که آدرس ایمیل نامعتبر است، استثناء رخ می دهد.
- بلوک “catch” استثنا را استفاده می کند و پیام خطا را نمایش می دهد.
استثناء چندگانه
ممکن است یک اسکریپت از چندین استثناء برای بررسی چند شرایط استفاده کند.
ممکن است از چند بلوک if..else، یک سوئیچ یا استثناء چند لانه استفاده کنید. این استثنائات می توانند از کلاس های استثنایی متفاوت استفاده کنند و پیام های خطای مختلف را ارسال می کنند:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example.com";
try {
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e) {
echo $e->errorMessage();
}
catch(Exception $e) {
echo $e->getMessage();
}
?>
توضیح مثال بالا:
کد فوق دو شرط را بررسیمی کند و اگر هر یک از شرایط برآورده شود، استثناء رخ می دهد:
- کلاس customException به عنوان یک توسعه از کلاس استثنای قدیمی ایجاد می شود. به این ترتیب تمام متدها و خواص را از کلاس استثنای قدیمی به ارث می برد
- تابع errorMessage ایجاد می شود تا اگر یک آدرس ایمیل نامعتبر باشد، این تابع یک پیام خطا را نشان دهد.
- متغیر $email یک رشته است که یک آدرس ایمیل معتبر است، اما حاوی رشته “example” است.
- بلوک “try” اجرا می شود و یک استثنا بر روی شرط اول پرتاب می شود.
- حالت دوم باعث ایجاد استثنا می شود زیرا ایمیل حاوی رشته “example” است.
- بلوک “catch” استثنا را به دست می گیرد و پیام خطای درست را نمایش می دهد.
پرتاب مجدد استثنا
گاهی اوقات، هنگامی که یک استثنا پرتاب می شود، ممکن است بخواهید آن را به طور متفاوتی از روش استاندارد اداره کنید. ممکن است استثنا یک بار دیگر در یک بلوک «catch» پرتاب شود.
یک اسکریپت باید اشتباهات سیستم را از کاربران پنهان کند. اشتباهات سیستم ممکن است برای برنامه نویسی مهم باشد، اما به نفع کاربر نیست. برای راحتی کاربر می توان استثنا را با یک پیغام دوستانه دوباره پرتاب کرد:
<?php
class customException extends Exception {
public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.';
return $errorMsg;
}
}
$email = "someone@example.com";
try {
try {
//check for "example" in mail address
if(strpos($email, "example") !== FALSE) {
//throw exception if email is not valid
throw new Exception($email);
}
}
catch(Exception $e) {
//re-throw exception
throw new customException($email);
}
}
catch (customException $e) {
//display custom message
echo $e->errorMessage();
}
?>
توضیح مثال بالا:
کد بالا در صورتی که آدرس ایمیل حاوی رشته “example” باشد، اگر انجام شود، استثنا دوباره پرتاب می شود:
- کلاس customException به عنوان یک توسعه کلاس استثنای قدیمی ایجاد می شود. به این ترتیب تمام متدها و خواص را از کلاس استثنای قدیمی به ارث می برد
- تابع errorMessage ایجاد می شود تا اگر یک آدرس ایمیل نامعتبر باشد، یک پیام خطا را نشان دهد.
- متغیر $email یک رشته است که یک آدرس ایمیل معتبر است، اما حاوی رشته “example” است.
- بلوک “try” حاوی بلوک “try” دیگری است تا بتواند استثنا را دوباره پرتاب کند.
- اگر ایمیل حاوی رشته “example” باشد استثنا رخ می دهد.
- بلوک “catch” استثنا را ذستگیر کرده و دوباره “customException” را پرتاب می کند.
- کلاس “customException” دستگیر شده و پیام خطایی را نمایش می دهد