مشخصات مقاله
-
2700
-
0.0
-
16714
-
0
-
0
آموزش مدیریت خطا Exception در PHP
آموزش کار با استثناء ها (Exception) در زبان PHP:
>
استثناءها (Exception) در زبان PHP، برای تغییر فرایند اولی برنامه یا اسکریپت، در زمانی که یک خطای خاصی رخ دهد، استفاده می شوند.
در این درس به آموزش کار با Exception و نحوه مدیریت خطا در برنامه خواهیم پرداخت.
یک استثناء یا Exception چیست؟
همزمان با ارائه نسخه جدید PHP5، یک راه جدید شی گرا (object oriented) برای مدیریت خطاها یا errors برنامه معرفی شد.
مدیریت استثناءها (Exception handling) برای تغییر روند اجرای برنامه در زمانی که یک خطای خاص (exceptional) رخ دهد، استفاده می شود. این شرط یا خطای خاص را Exception می گویند.
در لیست زیر، مراحل عادی که در هنگام فعال شدن یک Exception رخ می دهد، به ترتیب بیان شده است :
- وضعیت جاری کد برنامه ذخیره می شود.
- اجرای کد برنامه به تابع دلخواه و تعیین شده ای که وظیفه مدیریت Exception را دارد، سوئیچ می کند.
- برحسب شرایط، مدیریت کننده کد برنامه یا handler، ممکن است اجرای کد را از نقطه ای که ذخیره کرده شروع نماید، یا این که اجرای کل برنامه را متوقف نموده و یا ادامه اجرای برنامه ای مشخص شده در کد از سر گیرد.
در این درس، متدهای مختلف مدیریت Exception را به شرح زیر بررسی خواهیم کرد :
- نحوه ساده استفاده از Exception.
- طراحی یک مدیریت کننده Exception Handler دلخواه.
- مدیریت خطاهای چندگانه یا Multiple exception.
- طراحی و تنظیم یک مدیریت کننده سطح بالا خطا یا top level exception.
از Exception فقط بایستی در صورت بروز یک خطای خاص استفاده نموده و نمی توان از آن ها برای پرش از یک نقطه خاص در کد به نقطه دیگر استفاده کرد.
آموزش نحوه ساده استفاده از Exception :
هنگامی که یک exception در برنامه رخ می دهد، کد بعد از آن اجرا نخواهد شد و PHP به جستجوی ساختار دستوری “catch” متناظر با آن خواهد پرداخت.
اگر Exception رخ داده در برنامه را نتوان ردگیری و دریافت کرد، یک خطای آسیب زننده (fatal error) به همراه یک پیام با مضمون "خطای یافت نشده" خواهد داد.
در کد زیر، یک exception را در برنامه ایجاد کرده ایم، بدون این که آن را ردگیری کنیم :
1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception
checkNum(2);
?>
در صورت اجرای کد فوق، پیام خطای زیر صادر می شود :
Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' 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
آموزش کار با ساختارهای دستوری Catch و throw، Try :
برای جلوگیری از صدور پیام خطایی مثل کد فوق، بایستی یک ساختار لازم جهت مدیریت یک exception را ایجاد کنیم.
یک ساختار درست جهت مدیریت خطا یا exception بایستی شامل موارد زیر باشد :
- بخش Try : تابعی که از یک exception استفاده می کند، بایستی در بلوک کد “try” تعریف شود. اگر exception فعال نشود، فرآیند اجرای کد حالت نرمال خود را طی خواهد کرد. اما اگر یک exception فعال شود، در اصطلاح می گوییم که آن Exception صادر یا “trown” شده است.
- بخش Throw : بخش Throw مشخص کننده نحوه فعال سازی یک exception است. هر “throw” بایستی حداقل دارای یک بخش “catch” نیز باشد.
- بخش Catch : بلاک “Catch” استثناء یا exception رخ داده را دریافت نموده و یکی شی (object) حاوی اطلاعات مربوط به exception را ایجاد می کند.
حال بیایید exception مثال قبل با یک ساختار کامل و درست مجددا فعال کنیم :
1) {
throw new Exception("Value must be 1 or below");
}
return true;
}
//trigger exception in a "try" block
try {
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//catch exception
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
در صورت اجرای کد فوق، پیام هشدار زیر صادر می شود :
Message: Value must be 1 or below
توضیح کد مثال فوق :
همانطور که مشاهده کردید، کد مثال عملی فوق یک exception را فعال کرده و آن را دریافت می کند. مراحل زیر در طی انجام کار رخ می دهند :
- تابع chechNum() ایجاد می شود. این تابع چک می کند آیا عدد یا number وارد شده، بزرگتر از 1 می باشد یا خیر. در صورت بزرگتر بودن از 1، خطا یا exception روی خواهد داد.
- تابع CheckNum() درون ساختار “try” فراخوانی می شود.
- exceptuion کد به همراه تابع CheckNum() صادر می شود.
- پیام خطا حاصل از فعال شدن exception، به وسیله فراخوانی کد getMessage()<-$e از شی مربوط به exception، صادر می شود.
اما به هر حال، راه حل دور زدن قانون این که "هر throw بایستی یک ساختار Catch داشته باشد"، طراحی یک مدیریت کننده exception سطح بالاست که در پایان این درس به اموزش آن خواهیم پرداخت.
ایجاد یک کلاس دلخواه Exception Class :
برای ایجاد یک مدیریت کننده exception دلخواه، بایستی یک کلاس ویژه با توابعی که در زمان فعال شدن exception فراخوانی خواهند شد، را تعریف کنید. این کلاس بایستی یک زیرمجموعه یا فرزند از کلاس اصلی exception class در PHP باشد.
Exception class دلخواهی که ایجاد کرده اید، خواص (properties) خود را از کلاس اصلی PHP Exception Class به ارث برده و شما می توانید توابع مورد نیاز خود را نیز بدان اضافه کنید.
در کد مثال عملی زیر، یک کلاس exception class را ایجاد کرده ایم :
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' 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();
}
?>
کلاس جدید ایجاد شده، درواقع یکی کپی از کلاس exeption class قدیمی است که تابع errorMessage() را به آن اضافه کرده اید. از آنجایی که کلاس جدید یک کپی از کلاس اصلی و قدیمی exception class بوده و خواص و متدهای آن را به ارث برده است، می توانید در کلاس جدید از متدهای کلاس قدیمی مثل تابع های getline()، getFile() و getMessage() استفاده کنید.
توضیح مثال : کد مثال عملی این بخش، یک exception را فعال کرده و سپس با استفاده از یک کلاس exception آن را ردگیری می کند. مراحل انجام کار به صورت زیر است :
- کلاس customException() به عنوان یک مدل توسعه یافته از کلاس قدیمی exception class ایجاد شده است. از آنجایی که این کلاس از کلاس قدیمی به ارث رفته است، تمامی خواص و متدهای آن کلاس را به ارث برده است.
- تابع errorMessage() ایجاد می شود. این تابع در صورت وارد کردن یک ایمیل نادرست، پیام خطا صادر می کند.
- متغیر $email با یک مقدار متنی (string) پر می شود که حاوی یک ایمیل نادرست است.
- بلوک دستوری “try” اجرا شده و از آنجایی که ایمیل وارد شده درست نیست، exception تعیین شده روی می دهد.
- بلوک دستوری “catch”، خطا یا exception رخ داده را دریافت کرده و پیام خطا را نمایش می دهد.
آموزش کار با exception چندگانه :
این امکان وجود دارد که در یک اسکریپت، از چندین exception که به آن Multiple Exception می گوید، برای چک کردن شرایط مختلف کد استفاده کنید.
همچنین می توانید از چندین دستور if … else، ساختار switch و یا exception های چندگانه استفاده کنید. این خطا یا exceptuon ها می تواند از کلاس مختلف exception class استفاده کرده و پیام های هشدار متفاوتی صادر کنند.
در کد مثال عملی زیر، نحوه استفاده از exception چندگانه نشان داده شده است. کد را مرور کنید، در ادامه به تشریح مثال خواهیم پرداخت :
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' 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();
}
?>
توضیح مثال :
کد مثال عملی فوق، دو شرط یا Condition متفاوت را چک کرده و در صورتی که هر کدام از آن ها درست نباشند، exceptuion تعیین شده صادر می شود.
- کلاس customException() به عنوان یک نسخه جدید از کلاس قدیمی exception ایجاد می شود. در این حالت، کلاس جدید تمامی خواص و متدهای کلاس قدیمی را به ارث می برد.
- تابع errorMessage() ایجاد شده و این تابع در صورتی که ایمیل وارد شده نادرست باشد، یک پیام خطا را بر می گرداند.
- متغیر $email با یک مقدار متنی (string) که حاوی یک ایمیل درست می باشد، پر شده ولی شامل کلمه “example” خواهد بود.
- بلوک دستوری “try” اجرا شده و به دلیل درست بودن شرط اول کد، خطا یا exception روی نمی دهد.
- شرط دوم کد به دلیل وجود کلمه “example” در متغیر ایمیل ($email) یک خطا یا exception صادر می کند.
- بلوک دستوری “Catch”، خطا یا exception صادر شده را دریافت کرده و یک پیام هشدار صادر می کند.
آموزش ارسال مجدد خطا یا exception :
گاهی اوقات ممکن است در هنگام رخ دادن یک exception، آن را به شیوه ای متفاوت از حالت اسناندارد مدیریت کنید. این امکان وجود دارد که یک exception خاص را به وسیله یک بلوک کد “Catch” مجددا فعال یا ارسال نمایید.
یک اسکریپت بایستی خطاهای سیستم را از کاربر مخفی نگه دارد. خطاهای سیستمی برای کدنویس پروژه اهمیت زیادی دارد، ولی کاربران معمولی علاقه ای به این مباحث ندارند.
جهت آسان تر کردن مسائل برای کاربر، می توانید exception رخ داده را با ارسال یک پیام مناسب و کاربر پسند، مجددا نمایش دهید.
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” در آدرس ایمیل وجود دارد یا خیر. اگر وجود داشته باشد، خطا یا exception را مجددا ارسال (re-thrown) می کند، مراحل انجام کار به صورت زیر است :
- کلاس customException() به عنوان یک نسخه جدید از روی کلاس exception ایجاد می شود، به همین دلیل این کلاس، کلیه خواص و متدهای کلاس اصلی را به ارث می برد.
- تابع errorMessage() ایجاد می شود. این تابع در صورتی که آدرس ایمیل وارد شده، نادرست باشد یک پیام هشدار را بر می گرداند.
- متغیر $email با یک متغیر متنی (string) که شامل کلمه “example” نیز خواهد بود، پر می شود.
- خطا یا exception به دلیل وجود کلمه “example” در ایمیل، فعال خواهد شد.
- بلوک دستوری “catch” خطا یا exception رخ داده را دریافت کرده و یک “customException” دریافت شده و یک پیام هشدار صادر می کند.
اگر خطا یا exception در بلوک “try” جاری آن گرفته نشود، برنامه به دنبال دریافت آن در بلوک “catch” و یا مراتب بالاتر خواهد گشت.
آموزش تنظیم یک مدیریت کننده Exception سطح بالا :
تابع set_exception_handler() یک تابع تعیین شده توسط کاربر را به عنوان مدیریت کننده کلیه خطاها یا exception های گرفته نشده و رصد نشده در برنامه، تعیین می کند. کد زیر نحوه انجام کار را نشان خواهد داد :
Exception: " . $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
خروجی کد مثال فوق به صورت زیر خواهد بود :
Exception: Uncaught Exception occurred
در کد مثال عملی فوق هیچ ساختار دستوری “catch” ای تعریف نشده است. به جای آن، در صورت بروز هر خطا، مدیریت کننده exception سطح بالا یا top level exception handler فعال خواهد شد. این تابع کلیه خطاهای گرفته نشده در برنامه را دریافت و مدیریت می کند.
قوانین مربوط به exception در زبان PHP :
- معمولا کدها را در ساختارهای “try” قرار می دهیم تا امکان ردگیری بالقوه exception را افزایش دهیم.
- هر بلوک دستوری “block” یا “throw” بایستی حداقل یک بلوک کد “catch” متناظر داشته باشد.
- از exception های چندگانه می توان برای گرفتن کلاس های مختلف eception های برنامه استفاده نمود.هر Exception را می توان درون یک ساختار Catch متعلق به یک بلوک try، ارسال یا ارسال مجدد (re-thrown) کرد.
اگر یک خطا یا exception را ارسال می کنید (throw) حتما بایستی آن را دریافت (cathch) کنید.