ကဗ်ာ/ရသ/နည္းပညာ

PHP Error Handling

Sep 16, 2013

ဘာမွမေျပာေသးခင္တစ္ခု သိထားရမွာက error ကုိ ဘာနဲ႕မွ မဖမ္းထားဘူးဆိုရင္အဲဒီ error ဟာ
 Default handling ထဲကုိေရာက္သြားပါတယ္ ။
အဲဒီမွာသူက ဘာလုပ္ေပးလဲဆိုေတာ့ file ရဲ႕နာမည္ လိုင္းနံပါတ္ ကုိ သတ္မွတ္ၿပီးသား message နဲ႕အတူ ဘာ
error ပါလို႕ေျပာျပီး browser ကေန Output ထုတ္ေပးလိုက္တာပါပဲ ။
ဥပမာ-
Warning : fopen(welcome.txt)[function.fopen]: failed to open stream: No such file or directory in
C:\Xampp\htdocs\php\20.php on line 2
ဒါေလးက Default Handling ကေနဖမ္းၿပီးျပေပးတဲ့ Error ျဖစ္ပါတယ္ ။ ဒါေလးကုိေျပာရင္းနဲ႕ PHP Compiler
ဘယ္လိုအလုပ္လုပ္လည္းဆိုတာေလး ကုိလည္း ရွင္းျပေပးခ်င္ပါေသးတယ္ ။
HTML မွာ Interprater ပဲရွိပါတယ္ ။Interprater ဟာ Code ကုိတစ္ေၾကာင္းခ်င္းဆီဘာသာျပန္
ေပးပါတယ္ ။ ဒီေတာ့သူက Code ကုိ Run ေပးႏိုင္စြမ္းရွိၿပီး အမွားရွိေနရင္
ေတာ့ Result မျပႏိုင္ေတာ့ပါဘူး ။ Java ,C++ တို႕မွာေတာ့ Compiler ပါပါတယ္ ။
သူက ေတာ့စုစည္းၿပီး အသံုးခ်ပါတယ္ ။ျပသနာရွိေနရင္ error code ကုိထုတ္ေပးပါတယ္ ။
PHP မွာ Interpretation ေရာ Compilation ေရာ ႏွစ္မ်ိဳးစလံုး လိုအပ္သလိုအသံုးျပဳပါတယ္ ။
PHP ကုိ Run တဲ့အခါမွာ သူက Code အစုအေ၀းတစ္ခုလံုးကုိ Opcodes အျဖစ္ေျပာင္းလိုက္ပါတယ္။
အဲဒါက Compilation အဆင့္ျဖစ္ၿပီး Opcode ျဖစ္သြားတဲ့ အဆင့္မွာေတာ့ Interpretation သြား လုပ္ပါတယ္။
ဒီေတာ့ PHP ဟာ Run တိုင္း Run တိုင္းမွာ Re-Compile ျပန္ျပန္လုပ္သြားေလ့ရွိပါတယ္။
Interpretation ေရာ Compilation ေရာ အသံုးျပဳတဲ့အတြက္ အဓိကအားသာခ်က္က Code ကုိဘယ္ေနရာမွားေန
တယ္ဆိုတာလိုင္းနံပါတ္နဲ႕တကြ အတိအက် ေဖာ္ျပေပးႏိုင္ပါတယ္။
ဒါေပမယ့္ Developer အေနနဲ႕ ကေတာ့ error ျဖစ္လာႏိုင္သမွ်အားလံုး ကုိ User လြယ္လြယ္ကူကူ သိျမင္နားလည္
ႏိုင္မယ့္ ပံုစံအျဖစ္ၾကိဳတင္ရွာေဖြျပင္ဆင္ေပးထားဖို႕လိုအပ္ပါတယ္။
 ရိုးရွင္းတဲ့နည္းက die() function ကုိေခၚသံုးတာပါ ။
<?php
if(!file_exists("welcome.txt")){
die( "File not Exist .");
} else {
//CODE
}
?>
အခုလိုေရးထားမယ္ဆိုရင္ ေတာ့ welcome.txt ဖိုင္သာမရွိဘူးဆိုရင္ File not found ဆိုတဲ့ Error အျဖစ္ျပသေပး
မွာျဖစ္ပါတယ္ ။မူလ Error ကုိျပမွာမဟုတ္ေတာ့ပါဘူး ။ ဒါက die () ကုိေခၚၿပီး error ကုိဖမ္းေပးလိုက္တာေၾကာင့္
ပဲျဖစ္ပါတယ္ ။
တကယ္တမ္းအသံုးမ်ားတာကေတာ့ try{} catch{} Keyword ကုိအသံုးျပဳၿပီး error ဖမ္းေပးလိုက္တာျဖစ္ပါတယ္ ။
သူက if - else နဲ႕တူပါတယ္ ကြာသြားတာက catach မွာ exception ဆိုတာေလး ဖန္တီးေပးရပါတယ္ ။
catch(Exception $e) ဆိုၿပီးေတာ့ပါ ။ Exception အတြက္အျမဲ $e ကုိ Variable အျဖစ္ထားေပးရပါတယ္ ။
try Cause တစ္ခုအတြက္ catch အမ်ားအျပားထည့္သြင္း ေရးသားႏိုင္ပါတယ္ ။
Exception တိုင္းအတြက္ သတ္မွတ္ၿပီးသားError message ရွိၿပီးအဲဒီ Message ကုိပဲယူျပမယ္ဆိုလည္းရပါတယ္ ။
သပ္သပ္ ဖန္တီးျပမယ္ဆိုလည္းရပါတယ္ ။
ဥပမာ-
<?php
$a=5
$b=0
try {
    echo 1/$a ."<br/>";
    echo 1/$b ."<br/>";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(),"<br/>";
}
?>
ဒါဆိုရင္ေတာ့ Message တစ္ခုကုိ သူ႕ဖာသာသူထုတ္ေပးမွာျဖစ္ပါတယ္ ။တကယ္လို႕
catch (Exception $e) {
    echo "Couldn't devided by Zero .<br/>";
}
ဆိုရင္ေတာ့ ကုိယ္ျပခိုင္းတဲ့ Message ကုိျပေပးပါလိမ့္မယ္ ။
ေနာက္တစ္ခုအေနနဲ႕ throw() ကုိလည္းေခၚသံုးလို႕ရပါေသးတယ္ ။
ဥပမာ-
<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}
?>
ဒီ Handling ေတြကုိ ေပါင္းစပ္ၿပီးေတာ့လည္းအသံုးျပဳႏိုင္ပါတယ္ ။
ဥပမာ-
<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}
try {
    echo inverse(5) . "<br/>";
    echo inverse(0) . "<br/>";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(),"<br/>";
}
// Continue execution Code ;
?>
ဒီေနရာမွာ try throw catch သံုးခုလံုးတြဲစပ္အသံုးျပဳသြားတာေတြ႕ရပါလိမ့္မယ္ ။
ေနာက္တစ္ခုကေတာ့ Function တစ္ခုကုိယ့္ဖာသာဖန္တီးၿပီး Handle လုပ္ခိုင္းလိုက္တာျဖစ္ပါတယ္ ။
သူ႕ကုိ Custom Error Handler လို႕ေခၚပါတယ္ ။Functioin မွာ အနည္းဆံုး Main Parameter ႏွစ္ခု error Level နဲ႕
error Message  ကိုေဖာ္ျပေပးႏိုင္ရပါမယ္ ။တကယ္တမ္းမွာေတာ့ သူက Parameter ငါးခုအထိ ထားေပးလို႕
ရပါတယ္ ဒီလိုေလးပါ ။
error_function(error_level,error_message,error_file,error_line,error_context)
ဒီေတာ့ error levels ေတြကိုသိဖို႕လိုအပ္လာပါတယ္ ။
Value     Constant      Description
2     E_WARNING     Non-fatal run-time errors. Execution of the script is not halted
8     E_NOTICE     Run-time notices. The script found something that might be an
            error, but could also happen when running a script normally
256     E_USER_ERROR     Fatal user-generated error. This is like an E_ERROR set by the
            programmer using the PHP function trigger_error()
512     E_USER_WARNING     Non-fatal user-generated warning. This is like an E_WARNING
            set by the programmer using the PHP function trigger_error()
1024     E_USER_NOTICE     User-generated notice. This is like an E_NOTICE set by the programmer
             using the PHP function trigger_error()
4096     E_RECOVERABLE_ERROR     Catchable fatal error. This is like an E_ERROR but can be caught
                 by a user defined handle (see also set_error_handler())
8191     E_ALL         All errors and warnings (E_STRICT became a part of E_ALL in PHP 5.4)
ဒါေတြကုိ ျမန္မာလိုထက္ ဒီအတိုင္းေလးပဲ မွတ္တာပိုေကာင္းပါတယ္ ။ ဒီလိုေလးေတြရွိတယ္လို႕ပဲမွတ္ထားလိုက္ေပါ့။
အခု function ေလးတစ္ခု ဖန္တီးၾကည့္မယ္ ။
function customError($errNo,$errStr){
    echo "<b>Error:</b> [$errNo] $errStr<br/>";
    echo "Ending Script";
    die();
}
ဒါေလးကုိ Run တဲ့အခါ Error level နဲ႕ error message ကုိရယူၿပီးေတာ့ Output ျပေပးၿပီး Script ကုိ အဆံုးသတ္
ေပးပါလိမ့္မယ္ ။ ဒီ error handling function ကုိဖန္တီးၿပီးၿပီဆိုရင္ ဘယ္အခ်ိန္မွာ စအလုပ္လုပ္မယ္ဆိုတာ
သတ္မွတ္ေပးရပါတယ္။
အဲဒီအတြက္ set_error_handler() function ကုိသံုးၿပီး parameter တစ္လံုးပဲလိုပါတယ္။
error level ျပဖို႕အတြက္ parameter တစ္ခုထပ္ေပါင္းထည့္ေပးမယ္ဆိုရင္လည္း ရပါတယ္။
<?php
        //error handler function
    function customError($errno, $errstr)
    {
    echo "<b>Error:</b> [$errno] $errstr";
    }
        //set error handler
    set_error_handler("customError");
        //trigger error
    echo($test);
?>
သူ႔ကို runမယ္ဆိုရင္ -
Error:[8] Undefined variable: test  ဆိုတာမ်ိဳး ေလး Output ျပေပးမွာျဖစ္ပါတယ္။
ေနာက္ထပ္ PHP မွာ trigger_error() function ကိုသံုးႏိုင္္ပါတယ္။  ေအာက္က  ဥပမာမွာေတာ႔ test
varuableက  1 ထက္ၾကီးမယ္ဆိုရင္ error တစ္ခု ျဖစ္ေစဖို႕ေရးထားတာျဖစ္ပါတယ္။
<?php
    $test=2;
    if ($test>1)
    {
        trigger_error("Value must be 1 or below");
    }
?>
သူ႔ကို runတဲ႔အခါမွာ ေအာက္ကပံုစံအတိုင္း output ရပါတယ္။
Notice: Value must be 1 or below in C:\xampp\htdocs\php\30.phpon line5
ဒီပုံစံက Default Handler က error ဖမ္းေပးတဲ့ပံုစံ နဲ႕ တူတာကုိေတာ့သတိထားမိပါလိမ့္မယ္ ။
အခုဆိုရင္ PHP ရဲ႕ Error Handling ပိုင္းမွာ ေတာ္ေတာ္ေလး ျပည့္ၿပည့္စံုစံုေလ့လာႏိုင္မယ္လို႕ ေမွ်ာ္လင့္ပါတယ္ ။
ကၽြန္ေတာ့္အေရးအသားထဲမွာအမွားပါသြားတယ္ဆိုရင္လည္းေထာက္ျပေဆြးေႏြးႏိုင္ပါတယ္ ။
ေလ့လာရင္းပညာတိုးပြားပါေစ ဗ်ာ ။

No comments:

Post a Comment