با عرض سلام خدمت کاربران محترم پی وی لرن. در این جلسه قصد داریم به مبحث مدیریت استثنا (Exception Handling) در php بپردازیم.
جلسه پیش نیز به آموزش مدیریت خطا در php پرداختیم.
اگر خطای مشخصی رخ داده باشد، مدیریت استثنا برای تغییر جریان طبیعی کد استفاده می شود.
این اتفاقات معمولا هنگامی که یک استثنا رخ می دهد، می افتند:
در ادامه با روش های مختلف مدیریت استثنا آشنا خواهید شد:
وقتی یک استثنا رخ می دهد(پرتاب می شود)، ادامه کد اجرا نمی شود و php تلاش می کند تا بلوک “catch” متناظر را پیدا کند.
اگر یک استثنا گرفته نشود، یک خطا جدی با پیام “Uncaught Exception” ظاهر می شود.
بیاید یک استثنا را بدون گرفتنش راه اندازی کنیم:
1 2 3 4 5 6 7 8 9 10 11 12 | <?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("مقدار باید 1 یا کتر باشد"); } return true; } //trigger exception checkNum(2); ?> |
خروجی کد به شکل زیر می باشد:
1 2 3 4 | Fatal error: Uncaught exception 'Exception' with message 'مقدار باید 1 یا کتر باشد' in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6 |
برای جلوگیری از رخ دادن خطا بالا باید کدی فراهم کنیم تا استثنا را مدیریت کند.
این کد باید شرایط زیر را داشته باشد:
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php //create function with an exception function checkNum($number) { if($number>1) { throw new Exception("مقدار باید 1 یا کتر باشد"); } return true; } //trigger exception in a "try" block try { checkNum(2); //If the exception is thrown, this text will not be shown echo 'مقدار برابر یک یا بیشتر است'; } //catch exception catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?> |
خروجی به شکل زیر می باشد:
1 | Message: مقدار باید 1 یا کمتر باشد |
برای ساخت یک مدیریت کننده سفارشی باید یک کلاس خاص ایجاد کنید که توابعی داشته باشد تا بتوانند در هتگام رخ دادن استثنا فراخوانده شوند. کلاس شما باید از کلاس Exception ارث ببرد.
کلاس سفارشی ما پروپرتی ها (متغیر) کلاس Exception را به ارث می برد که می توانید آن ها را در کلاس خود استفاده کنید.
کد ساخت کلاس:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?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(); } ?> |
کلاس جدید یک کپی از کلاس قدیمی exception به علاوه یک تابع ()errorMessage هست.چون که این کلاس یک کپی هست و متغیر ها و متد ها (تابع) را به ارث می برد، ما می توانیم از توابعب مثل ()getLine و ()getFile و ()getMessage استفاده کنیم.
این امکان وجود دارد که از چندین استثنا برای شرایط مختلف استفاده کنیم.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php class customException extends Exception { public function errorMessage() { //error message $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> آدرس ایمیل معتبر نیست'; 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(); } ?> |
کد بالا دو شرط را آزمایش می کند و اگر هیچ کدام از شرط ها برقرار نباشد یک استثنا پرتاب می کتد.
گاهی اوقات وقتی یک استثنا راه اندازی می شود، ممکن است شما بخواهید که آن را از متفاوت از روش استاندارد مدیریت کنید.
این امکان وجود دارد تا استثنا یک بار دیگر در بلوک catch پرتاب شود.
یک اسکریپت باید خطا سیستم را از دید کاربران مخفی نگه دارد. ممکن است که خطا های سیسم برای برنامه نویس مهم باشد اما برای کاربران جالب نیستند.
برای اینکه کاربر راحت باشد می توانید استثنا را با یک پیام بهتر و مورد پسند تر مجددا رتاب کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?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(); } ?> |
تابع ()set_exception_handler یک تابع کاربرساز را برای مدیریت استثنا های گرفته نشده تنظیم می کند:
1 2 3 4 5 6 7 8 9 | <?php function myException($exception) { echo "<b>Exception:</b> " . $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?> |
خروجی کد بالا:
1 | Exception: Uncaught Exception occurred |
یک قانون ساده: اگر چیزی را پرتاب کردید، باید آن را بگیرید.
جلسه مدیریت استثنا در php و سری جلسات آموزش پیشرفته زبان php به اتمام رسید. امیدوارم این آموزش ها مفید واقع شده باشند.
با پی وی لرن همراه باشید.
همچنین می توانید نظرات و سوالات خود را از طریق بخش نظرات با ما در میان بگذارید.
سپهر
جالب بود پشنهاد میشه تا اخر بخونید.