មេរៀនទី៦: Error និង Exception

ក្នុងជំពូកនេះរៀនពីរបៀប  :

-ប្រើបណ្តាកន្សោម try, catch និង finally ដើម្បីគ្រប់គ្រង exceptions

-ប្រើពាក្យ Control checked និង unchecked keywords ។

– បញ្ចូល exceptions ពីក្នុងកម្មសិទ្ធិ methods ដែលប្រើ keyword.

-exceptions ក្នុង Microsoft Visual Studio .NET debugger។

1. Coping ជាមួយ Error

នៅពេលហៅ method មួយអ្នកឆែកមើលអថេរទាំងអស់ ដើម្បីមើលថា តើ method failed ឬយ៉ាងណា? ដំណោះស្រាយគឺមានការលំបាកព្រោះមាន ហេតុផលដូចខាងក្រោមនេះ:

· កម្មវិធី logic ចម្បងដែលប្រទាក់គ្នាជាមួយឆ្លាស់ code គ្នាដើម្បីឆែក errors ។ កម្មវិធីមានការលំបាកយល់ ។

· ត្រួតពិនិត្យ error ការប្រើ code គឺជាប្រភេទដដែលៗនិងអាចមាន ភាពងាយស្រួលបង្កើតទំហំ size នៃកម្មវិធីកម្មវិធីធំមានការលំបាកខ្លាំង harder ក្នុងការស្វែងយល់ពីកម្មវិធីតូចៗ ។

· គ្រប់ methods ទាំងអស់មានការយល់ព្រមលើបង្កើតអថេរទាំងអស់ ទៅតំលៃដែលមិនប្រើក្នុង method ផ្សេងទៀត ។

2. អនុវត្ត Code និងការចាប់ Exception

គំនិតក្នុងការដំណើរការនៅក្នុង exception គឺជា code ដែលអនុវត្តជាចម្បងនៃកម្មវិធីពីក្នុង error code ។ កាលណាពីផ្នែកត្រូវបាន

បែងចែក ។ ដើម្បីសរសេរកម្មវិធី exception-aware អ្នកត្រូវការពីរបញ្ហាទីមួយ

សរសេរ code នៅក្នុង try block (try គឺជា keyword) ។

ទីពីរអ្នកសរសេរ catch មួយឬច្រើន (catch គឺជា keyword) ។ ប្រសិនបើមួយនៃ statements នៅក្នុង try block ដែលបង្កើតនៅក្នុង exception តាមធម្មតា left-to-right, top-to-bottom នៃកម្មវិធីគែ halts, និងការត្រួតពិនិត្យការបញ្ជួនដោយផ្ទាល់ catch ។

try

{

int leftHandSide = Int32.Parse(leftHandSideOperand.Text);

int rightHandSide = Int32.Parse(rightHandSideOperand.Text);

int answer = doCalculation(leftHandSide, rightHandSide);

result.Text = answer.ToString();

}

catch (FormatException fEx)

{

// Handle the exception

}

វិធី System.Int32.Parse method ព្យាយាមដើម្បីប្តូរវាក្នុង string argument ទៅក្នុងចំនួនគត់ integer ។ ឧទាហរណ៍ “99” គឺត្រូវបានប្តូរ ទៅក្នុង 99 ។ អ្វីដែលអ្នកនឹងមាន System.Int32.Parse ត្រឡប់មកវិញកាលណាផ្ញើ string ក្នុង format ដែលខុសដូចជា “Tommy Trewblew” ចំលើយគឺមិន ត្រឹមត្រូវ ។ អ្វីក៏ដោយតំលៃវាត្រឡប់ (-1 ជាឧទាហរណ៍) ។
a3. ប្រើប្រាស់ Multiple catch

តាមពិតភាពខុសគ្នា errors បោះចោលពីភាពខុសគ្នាប្រភេទនៃ exceptions ដើម្បីបង្ហាញពីប្រភេទខុសគ្នាការបរាជ័យ failure ។ ឧទាហរណ៍ សន្មតថាប្រើ  method ដែលហៅថាការគណនាដែលអាចបោះចោល

DivideByZeroException ។ ដើម្បី demo បញ្ហានេះអ្នកអាចសរសេរ catch handler ជាប់គ្នាដូចខាងក្រោមនេះ:

try

{

int leftHandSide = Int32.Parse(leftHandSideOperand.Text);

int rightHandSide = Int32.Parse(rightHandSideOperand.Text);

int answer = doCalculation(leftHandSide, rightHandSide);

result.Text = answer.ToString();

}

catch (FormatException fEx)

{

//…

}

catch (OverflowException oEx)

{

//…

}

4. សរសេរ catch Handler ជាទូទៅ

ជាទូទៅ catch Handler វាទទួលដំណើរការបានល្អប្រសើរ ។ ប្រសិន

បើអ្នកមិនចង់សរសេរ catch handler ដែលមានលក្ខណ:ពិសេសដោយឡែក

ខុសគ្នាពីប្រភេទនៃ​ exception (ប៉ុន្តែមិនមានការធុញទ្រាន់ពីព្រោះវាមាន

ប្រភេទខុសគ្នានៃ exceptions) អ្នកអាចសរសេរ catch handler មួយដែល នឹង catch exception ។

try

{

int leftHandSide = Int32.Parse(leftHandSideOperand.Text);

int rightHandSide = Int32.Parse(rightHandSideOperand.Text);

int answer = doCalculation(leftHandSide, rightHandSide);

result.Text = answer.ToString();

}

catch (Exception ex) // this is a general catch handler

{

//…

}

មាន syntax មួយផ្លាស់ប្តូរ catch handler ជាទូទៅគឺ catch { … } ក្នុងករណីនេះអ្នកមិនត្រូវការប្រភេទ exception ។

ប្រសិនបើលោកអ្នករត់ដំណើរការក្នុង Debug ពេលនោះបានជួបបញ្ហា occur លោកអ្នកចាប់ផ្តើមជាមួយ Start Without Debugging។
aចុចលើពិស្តារ Details ក្នុងប្រអប់ Exception dialog ដើម្បីបង្ហាញព័ត៌មាន
aជោគជ័យក្នុងដំណើរការ FormatException

សរសេរ try/catch statement

1. ចាប់ផ្តើម Start Visual Studio .NET ។

2. បើក MathsOperators project ដែលមានទីតាំងក្នុង \Microsoft Press\Visual C# Step By Step\Chapter 6\MathsOperators folder នៅក្នុង My Documents folder របស់អ្នក ។

2. បើក MathsOperators project ។ មុនពេលរត់កម្មវិធីប្រើប្រាស់ ដំបូងអ្នកនឹងបង្កើត Exception settings ឡើងវិញនៃ Visual Studio ដូច្នេះ debugger មិនធ្វើ automatically ចាប់ផ្តើមកាលណា exception ត្រូវបានបោះចោល ។

3. នៅលើ Debug menu ចុចលើ Exceptions ។ បើកប្រអប់ Exceptions dialog box ។
a4. ក្នុង  Exception list ជ្រើសរើស Common Language Runtime Exceptions category ។

5. កាលណា Exception ត្រូវបានបោះចោល ជ្រើសរើស Continue ។

6. ក្រោម If The Exception Is Not Handled ជ្រើសរើស Continue.

7. ចុចលើ OK ។ ប្រអប់ Exceptions dialog box បានបិទ ។

8. លើ Debug menu ចុច Star ។ ឬប្រើ shortcut key សំរាប់ចាប់ ផ្តើម Start គឺចុចលើ F5 ។ កម្មវិធី Visual Studio .NET សង់បង្កើត

ឡើងនិងរត់ដំណើរការ Windows application ។ Exceptions Form បង្ហាញឡើង ។
a9. បញ្ចូលឈ្មោះ Enter John ក្នុងប្រអប់ខាងឆ្វេងដៃ Left Operand text box រួចហើយចុចលើ Calculate ។ កម្មវិធីប្រើប្រាស់ shuts down រួចហើយអ្នកត្រឡប់ទៅកម្មវិធី Visual Studio .NET programming ។ ពេល error ក្នុង text ដែលអ្នកបញ្ចូលក្នុងប្រអប់ ខាងឆ្វេងដៃ Operand text box បណ្តាលអោយមានមូលហេតុជាមួយ

កម្មវិធីប្រើប្រាស់បរាជ័យ fail ។ អាច message វិនិច្ឆ័យក្នុង Output window ។ អ្នកនឹងឃើញចំនួននៃ messages អំពី DLLs ចាប់ផ្តើម បញ្ចូលដោយ runtime ។ ខាងក្រោមនេះអ្នកនឹងឃើញ messages:

An unhandled exception of type ‘System.FormatException’

occurred in mscorlib.dll

Additional information: Input string was not in a correct format.

Unhandled Exception: System.FormatException:Input string was

not in a correct format.

at System.Number.ParseInt32(String s, NumberStyles style,

NumberFormatInfo info)

at Methods.Form1.calculate_Click(Object C:\Visual C# Step By Step\Chapter 6\MathsOperators\Form1.cs:line 257

ពីក្នុង text នេះអ្នកអាចស្រាវជ្រាវ exception ត្រូវបានបោះចោលដែល  ហៅទៅ System.Int32.Parse ក្នុង calculate_Click method ។

10. បន្ថែម try block ដែលរួមមាន 4 statements ក្នុង calculate_Click method ជាក់ស្តែងដូចខាងក្រោមនេះ:

try

{

int lhs = System.Int32.Parse(lhsOperand.Text);

int rhs = System.Int32.Parse(rhsOperand.Text);

int answer = doCalculation(lhs,? rhs);

result.Text = answer.ToString();

}

Add a catch block after this new try block, exactly as? follows:

catch (System.FormatException? caught)

{

result.Text = caught.Message;

}

10. catch handler នេះចាប់យក FormatException thrown ដោយ System.Int32.Parse រួចហើយសរសេរ Message property របស់វាទៅក្នុង Text property នៃប្រអប់លទ្ធផល text box នៅខាង ក្រោមនៃ form ។

11. នៅលើ Debug menu ចុចលើ Start ចូល Visual Studio .NET សង់បង្កើតឡើងវិញរួចរត់ដំណើរការកម្មវិធីប្រើប្រាស់ ។ អ្នកនឹងបញ្ចូល វាឥឡូវនេះដែលមានតំលៃដូចគ្នាដែលបណ្តាលកម្មវិធីប្រើប្រាស់ fail ។ 12. វាយសរសេរ John ក្នុងប្រអប់ខាងឆ្វេងដៃ Operand text box រួច ចុចលើ Calculate ។  ពេលនោះ catch handler ជោគជ័យ

បានចាប់យក FormatException និងផ្ញើ message “Input string was not in a correct format.” ត្រូវបានសរសេរទៅក្នុងប្រអប់ Result text box ។
a

13. ចុចលើ Quit ។ អ្នកត្រឡប់ទៅក្នុងកម្មវិធី Visual Studio .NET ។

5. ប្រើប្រាស់ Checked និង Unchecked

ក្នុងជំពូកទី2ខាងលើអ្នកបានរៀនពីរបៀបប្រើប្រមាណវិធី binary arithmetic ដូចជា + និង * លើប្រភេទ data types ដូចជា int និង double ។

អ្នកបានឃើញប្រភេទ data ដើមកំណើតដែលមានទំហំមិនប្រែប្រួល ។ ឧទាហរណ៍  C# int គឺជាចំនួនពិត 32 bits ។ ព្រោះ int មានទំហំមិនប្រែប្រួល

អ្នកដឹងច្បាស់ពីចំនួនគត់ integer គឺ-232 ទៅ 232-1 ។ ប្រសិនបើអ្នកសំរេច បង្កើតតំលៃ minimum ឬ maximum value នៃ int ក្នុង code អ្នកអាចប្រើ System.Int32.MinValue ឬ System.Int32.MaxValue fields ។

សរសេរ checked Statement

checked statement គឺជាបណ្តុំនៅខាងមុខជាមួយ checked keyword ។ ទាំងអស់គឺជាចំនួនគត់ integer arithmetic ក្នុង checked

statement បោះចោល OverflowException ដែលបង្ហាញដូចក្នុងឧទាហរណ៍

ខាងក្រោមនេះ:

int number = System.Int32.MaxValue;

checked

{

int willThrow = number++;

Console.WriteLine(“this won’t be reached”);

}

ចំនួនគត់ integer arithmetic មានក្នុងបណ្តុំ checked blockគឺជា checked ។ ឧទាហរណ៍ ប្រសិនបើមួយនៃ checked statements គឺហៅ method ។

អ្នកអាចប្រើ unchecked keyword បានផងដែរដើម្បីបង្កើតបណ្តុំ unchecked block statement. ចំនួនគត់ទាំងអស់នៅក្នុងបណ្តុំ unchecked គឺមិនមែនជា checked ឧទាហរណ៍:

int number = System.Int32.MaxValue;

unchecked

{

int wontThrow = number++;

Console.WriteLine(“this will be reached”);

}

សរសេរកន្សោម Checked Expression

អ្នកអាចប្រើ checked និង unchecked keywords បានផងដែរ ដើម្បីត្រួតពិនិត្យលើកន្សោម integer expressions ដែលនៅពីមុខកន្សោម សញ្ញាវង់ក្រចកជាមួយ checked ឬ unchecked keyword​ ដូចដែលបង្ហាញ ក្នុងឧទាហរណ៍នេះ:

int wontThrow = unchecked(System.Int32.MaxValue+1);

int willThrow = checked(System.Int32.MaxValue+1);

ប្រមាណវិធី compound ដូចជា += និង -= និងប្រមាណវិធីបង្កើន  (++) និងបញ្ចុះ (–) គឺជាប្រមាណវិធីអាចត្រួតពិនិត្យដែលប្រើ checked និង unchecked keywords ។ ចាំថា x += y; គឺដូចជា x = x + y; ។

ប្រើកន្សោម checked expression

1. នៅលើ Debug menu ចុចលើ Exceptions ។ ប្រអប់ Exceptions dialog box បើកចេញ ។

2. ជ្រើសរើស Common Language Runtime Exceptions ។

3. កាលណា Exception ត្រូវបានបោះចោល ជ្រើសរើស Continue ។

4. ក្រោម If The Exception Is Not Handled ជ្រើសរើស Break Into The Debugger រួចចុលើ click OK ។

5. លើ Debug menu ចុចលើ Start. Visual Studio .NET សង់បង្កើត រួតរត់ដំណើរការ Windows application ។

6. វាយសរសេរ 9876543 ក្នុងប្រអប់ខាងឆ្វេងដៃ Operand text box, វាយសរសេរ 9876543 ក្នុងប្រអប់ខាងស្តាំដៃ Right Operand text box ។ ជ្រើសរើស Multiplication option ក្រោមប្រមាណវិធី រួចចុច

លើ Calculate ។  តំលៃ -1195595903 បង្ហាញក្នុងប្រអប់ Result text box លើ form ។

7. ក្នុង Quit អ្នកត្រឡប់ទៅក្នុងកម្មវីធី Visual Studio .NET ។

8. ក្នុងសន្លឹក Code ទីតាំងតំលៃជាច្រើន method:

private int multiplyValues(int lhs, int rhs)

{

expression.Text = lhs.ToString() + ” * ” + rhs.ToString();

return? lhs * rhs;

}

9. Edit ត្រឡប់ statement ដែលត្រឡប់ទៅតំលៃគឺ checked ។ តំលៃច្រើន multiplyValues method និងមើលឃើញដូចខាងក្រោម:

private int multiplyValues(int lhs, int rhs)

{

expression.Text = lhs.ToString() + ” * ” + rhs.ToString();

return checked(lhs * rhs);

}

9. ឥឡូវនេះជ្រើសរើស checked រួចបោះចោលOverflowException

10. នៅលើ Debug menu ចុចលើ Start ចូលក្នុង Visual Studio .NET​ សង់បង្កើតរួចរត់ដំណើរការ Windows application ។

11. វាយសរសេរ 9876543 ក្នុងប្រអប់ខាងឆ្េវង Left Operand text box វាយសរសេរ 9876543 ក្នុងប្រអប់ខាងស្តាំដៃ Right Operand text box ជ្រើសរើស Multiplication option ក្រោមប្រមាណវិធីរួចចុច

លើ Calculate ។ អ្នកត្រឡប់ចូលទៅកម្មវិធី Visual Studio .NET និង ឃើញ message box បង្ហាញ ។ ក្នុង message ប្រាប់អោយអ្នកដឹង statement ក្នុង code ត្រូវបានបោះចោល OverflowException ។
a12. ចុចលើ Break ។ ប្រអប់ message box បានបិទ អ្នកឥឡូវមើល code Code ក្នុង debug mode ។

debug line គឺទៅខាងឆ្វេងដៃនៃ return statement ក្នុងតំលៃ

multiplyValues method:

return checked(lhs * rhs);

ធ្វើចលនាក្នុង cursor លើអថេរ rhs ក្នុង statement ។ បង្ហាញប្រាប់ តំលៃនៃ rhs គឺជា 9876543 ។

13. នៅលើ Debug menu ចុចលើ Stop Debugging ។ ប្រសិនបើ

សន្លឹក Debug window ត្រូវបានបើក អ្នកអាចចុចលើប៊ូតុង

Stop Debugging ។

14. ក្នុងសន្លឹក Code window ទីតាំង calculate_Click method។

15. បន្ថែម catch handler ភ្លាមៗនោះបន្ទាប់ពីមានរួចស្រេច catch handler ក្នុង calculate_Click method:

catch(System.OverflowException caught)

{

result.Text = caught.Message;

}

16. នៅលើ Debug menu ចុចលើ Start ចាប់ផ្តើម Visual Studio .NET សង់បង្កើតឡើងវិញរួចរត់សន្លឹក Windows application ។

17. វាយសរសេរ 9876543 ក្នុងប្រអប់ Left Operand text box វាយសរសេរ 9876543 ក្នុងប្រអប់ Right Operand text box

ជ្រើសរើស Multiplication option ក្រោមប្រមាណវិធីរួចុចលើ Calculate ។ ទីពីរ catch handler ជោគជ័យចាប់លើ OverflowException និង debugger មិនចាប់ផ្តើម ។ ពេលនោះ message ត្រូវបានសរសេរបង្ហាញក្នុងប្រអប់លទ្ធផល Result text box ។aa6. ​បន្ថែម Exception

សន្មតថាអ្នកកំពុងអនុវត្ត method ដែលហៅថា monthName ដែលព្រមទទួល int argument និងត្រឡប់ទៅឈ្មោះ name ត្រូវគ្នាទៅ month ។ ឧទាហរណ៍ monthName(1) នឹងត្រឡប់ “January”: អ្វីជា method return កាលណាចំនួន integer argument តូចជា 1 ឬធំជាង12 ។ ឈ្មោះ name នៃ ខែ month -16 ឬ month 1356 ។ ក្នុងរយះពេលជាយូរអ្នកនឹងរកមើលថ្នាក់នឹង

ពិណ៌នាពីលក្ខណ:ហើយអ្នកអាចប្រើវា (ប្រសិនបើមិនមាន អ្នកអាចបង្កើតវា ដោយងាយជាកម្មសិទ្ធិ exception class ប៉ុន្តែអ្នកត្រូវការស្គាល់ពីអ្វីដែលអាចធ្វើបាន ។ ក្នុងករណីនេះ .NET Framework System.Argumentout of

RangeException class គឺត្រឹមត្រូវ:

public static string monthName(int month)

{

switch (month)

{

case 1 :

return “January”;

case? 2 :

return “February”;

case 12 :

return “December”;

default :

throw new System.ArgumentOutOfRange

Exception(“Bad month”);

}

បន្ទាប់មក statement គឺជាឧទាហរណ៍នៃ throw statement:

throw new System.ArgumentOutOfRange

Exception(“Bad month”);

throw statement មានពីរផ្នែក ។ ទីមួយផ្នែកក្នុង throw keyword ។  អ្នកប្រើ throw keyword ដើម្បីលុបចោល exception object ។ throw keyword គឺជាឈ្មោះ well-named ។ ផ្នែកទីពីរគឺជាដែលអ្នកកំពុងលុប។ ក្នុង ឧទាហរណ៍នេះប្រើកន្សោមដែលបង្កើត object ថ្មី ។ កន្សោមបន្ទាប់គឺជាផ្នែក ដែលបង្កើត ArgumentOutOfRange (ដែលនៅក្នុង System namespace) មានផ្ទុក message “Bad month”:

new System.ArgumentOutOfRangeException

(“Bad month”)

ឧទាហរណ៍នេះគឺជា method ដែលមាននិយាយច្បាស់លាស់ក្នុង ជំពូកទី 7 ។ Throw ជាកម្មសិទ្ធ exception របស់អ្នក:

  1. នៅលើ Debug menu ចុចលើ Start ចូលក្នុង Visual Studio .NET រត់ដំណើរការកម្មវិធី Windows application ។

2. ចុចលើ Calculate មិនជ្រើសរើស option ប្រមាណវិធី

3. វាយសរសេរ 24 ក្នុងប្រអប់ឆ្វេងដៃ Operand text box សរសេរ 24 ក្នុង ប្រអប់ស្តាំដៃ Right Operand text រួចចុចលើ Calculate ។ វាយតំលៃ zero បង្ហាញក្នុងប្រអប់ Result text box ។
a