ว่าด้วยเรื่องของ ERROR

ในบทความก่อนหน้านี้ ผมได้อธิบายวิธีการดู error ใน MATLAB ไปแล้วนะครับ แต่ในการเขียนโปรแกรมระดับสูงนั้น error ไม่ได้มีแค่เท่าที่ตาเห็นนะครับ ซึ่งการแก้ไขก็จะยากขึ้นไปอีก ดังนั้นในบททความนี้ เราจะมาดูกันครับว่า error มันมีกี่ประเภท อะไรบ้าง

ประเภทของ error


ประเภทแรก เรียกว่า Compile error คือ error ที่เกิดตอนเวลาคอมไพล์โปรแกรม ซึ่งเกิดจากเราเขียนโค้ดไม่ถูกนั่นแหละครับ ก็แก้ด้วยการกลับไปเขียนให้ถูกซะ

ประเภทที่สอง เรียกว่า Runtime error คือ error ที่เกิดตอนรันโปรแกรม

บางคนอาจจะสงสัยว่า ถ้าคอมไพล์แล้วไม่ error โปรแกรมก็น่าจะถูกต้องแล้วหนิ ทำไมเวลารันถึงมี error อยู่อีกละ? ดังนั้นเราจะมาดูกันครับว่าถ้าโค้ดไม่ผิด ทำไมรันแล้วถึง error ได้ละ

Runtime error มีแบบไหนบ้าง?

1. โปรแกรมทำงานได้ปกติ (คำนวณผลลัพธ์ออกมาได้) แต่คำตอบผิด

เป็นเคสที่เกิดขึ้นบ่อยมากครับ (และคนที่เขียนก็ไม่รู้ตัวด้วยว่าผิด) ปัญหานี้เกิดจาก "มื่อใหม่" ที่ไม่เข้าใจความหมายของ "คำสั่ง" ดีพอ แล้วก็นำไปใช้แบบผิดๆ เช่น

>> A = B.*C;
>> D = B*C;

หลายๆ คนไม่เข้าใจว่าการใช้ ดอท-คูณ (.*) กับ คูณเฉยๆ ต่างกันยังไง ซึ่งการเขียนทั้ง 2 แบบนี้ไม่มีแบบไหนผิด และถูกต้องทั้ง 2 แบบ เพราะมันเป็นการคูณคนละวิธี ถ้าหาก B หรือ C มีตัวใดตัวหนึ่งที่เป็น scalar (ค่าคงที่) หรือทั้งสองตัวเป็น scalar การคูณทั้ง 2 แบบนี้จะให้ผลลัพธ์เหมือนกัน แต่ถ้าหากทั้ง B และ C เป็นอาเรย์ ความหมายของทั้งสองแบบจะต่างกันดังนี้


จากตัวอย่างที่ผมทำให้ดู จะเห็นแล้วนะครับว่า (.*) คือการเอาสมาชิกในอาเรย์มาคูณกันแบบ scalar ส่วน (*) คือการคูณแบบแมททริกซ์ ซึ่งแน่นอนว่าคำตอบทั้ง 2 วิธีนี้ย่อมต่างกัน ส่วนวิธีไหนคือวิธีที่ถูกต้องนั้น ขึ้นอยู่กับอัลกอริทึมที่ผู้เขียนโค้ดใช้ครับ ว่าวิธีการนั้นเขาให้คูณกันแบบไหน

การแก้ไข
การแก้ error ประเภทนี้ทำได้ยากมากครับ เพราะเราไม่รู้ว่ามันไป error อยู่ที่ส่วนไหน เวลาแก้ก็ต้องไล่ตรวจสอบคำตอบของการคำนวณทีละขั้นตอน เพื่อดูว่าโปรแกรมมันคำนวณผิดที่ขั้นตอนไหน แล้วค่อยไปตรวจสอบต่อว่าในขั้นตอนนั้น มันคำนวณผิดที่คำสั่งไหน แล้วค่อยไปแก้ที่คำสั่งนั้น ผมบอกเลยครับว่า error ประเภทนี้เป็น error ที่ทำผมปวดหัวมากที่สุดเวลาแก้ครับ (ดังนั้นใครที่บอกว่า ช่วยแก้โค้ดให้หน่อย มีโค้ดเก่ามาให้ อย่าคิดว่ามันทำได้ง่ายๆ นะครับ)

2. Error เพราะ input

เมื่อไรก็ตามที่เราต้องเขียนโปรแกรมเพื่อรับค่าจาก user โปรแกรมของเราจะมีโอกาส error สูงมากครับ เพราะถ้าหาก user ป้อนข้อมูลถูกต้อง โปรแกรมเราก็ทำงานได้ถูกต้อง แต่ถ้าหาก user ป้อนข้อมูลเข้ามาผิดนั่นแหละ ที่จะทำให้โปรแกรมของเราทำงานผิดพลาด

ซึ่งเราเองก็ทำได้แค่เขียนข้อความกำกับไว้ตรงช่อง ว่าให้ป้อนอะไร (แต่ก็ยังป้อนผิดอยู่เหมือนเดิม ไม่รู้ว่าไม่ได้อ่านกันรึไง) แต่ถึงเราจะเขียนข้อความบอกเอาไว้แล้ว ก็ไม่ได้หมายความว่า user จะต้องป้อนตามที่เราบอกนะครับ บางคนไม่ได้อ่าน ป้อนเข้ามาผิดก็ยังมี ดังนั้นเมื่อเราแก้ที่ user ไม่ได้ เราก็ต้องเขียนโปรแกรมเอาไว้ ให้มันรองรับ หรือทำงานได้กับทุกรูปแบบข้อมูลที่ user จะป้อนเข้ามา เช่น

ถ้าเราบอกว่าให้ user เลือกรถ ว่าตัวเองชอบคันไหน จะได้แสดงราคาได้ โดยให้บอกว่าเป็นคันที่ 1 2 3 หรือ 4 จากโจทย์ลักษณะแบบนี้ เราจะเห็นนะครับว่า user ต้องป้อนข้อมูลที่เป็นตัวเลขจำนวนเต็มเท่านั้น จะมาป้อนเลขทศนิยม เช่น 3.5 ไม่ได้ (เพราะมันไม่มีรถคันที่ 3.5 ไง)

การแก้ไข
หลังจากรับค่าเข้ามาแล้ว เราก็ต้องเขียน "ฟังก์ชันตรวจสอบ" ด้วยว่า ค่านั้นตรงกับเงื่อนไขที่เรากำหนดไหม ถ้าไม่ตรงจะให้ทำยังไง เช่น ให้ user ป้อนเข้ามาใหม่ หรือให้จบการทำงานโดยบอกว่าไม่ทราบราคาของรถคันดังกล่าว ประมาณนี้

*เน้นย้ำตรง "ฟังก์ชันตรวจสอบ" นะครับ ผมไม่ได้หมายความว่า MATLAB มีฟังก์ชันประเภทนี้ให้คุณเรียกใช้งานนะ แต่คุณต้องเขียนฟังก์ชันนี้ขึ้นมาเอง เหมือนในตัวอย่างเรื่อง if-else ที่ผมยกมาให้ดูในแม็ทแล็บพื้นฐาน 1 (ใครยังไม่ได้อ่าน อ่านได้ที่นี่ครับ)

3. Error เพราะการคำนวณ

ในอัลกอรึทึมด้านวิศวกรรมขั้นสูง หลายๆ อัลกอริทึม ในระหว่างการคำนวณ อาจเกิดข้อผิดพลาดขึ้นได้ เช่น ค่าของตัวแปรตัวใดตัวหนึ่ง น้อยเกินไป ไม่สามารถคำนวณต่อได้ หรือ เกิดเคสที่ "ไม่นิยาม" ในการคำนวณ เช่น 0/0 หรือ inf/inf ซึ่งเคสพวกนี้เราไม่มีทางรู้ล่วงหน้าว่ามันจะเกิดขึ้น เพราะโดยมากแล้ว ค่าที่ใช้ในการคำนวณก็จะเป็นค่าที่ได้จากการวัด หรือค่าที่รับเข้ามาแบบรีลไทม์จาก sensor

Error ประเภทนี้ป้องกันไม่ได้ เหมือน 2 ประเภทก่อนหน้านะครับ เพราะถ้าเราดูด้วยตาเปล่า ข้อมูลที่ input เข้ามา มันก็อยู่ในรูปแบบที่ถูกต้องอยู่แล้ว กว่าเราจะรู้ว่ามันผิด ก็หลังจากที่เอาไปคำนวณโน่นแหละครับ และก็ไม่ใช่ว่ามันจะคำนวณผิดทุกครั้ง คือมันจะมีแค่ input บางค่า หรือ บางตัว เท่านั้น ที่ทำให้โปรแกรมทำงานผิด ดังนั้น error ประเภทนี้ไม่นิยมแก้ไขครับ แต่ใช้วิธี "ข้ามการทำงาน" ในรอบนั้นไป เพราะถึือว่าข้อมูลชุดนั้นไม่ใช่ข้อมูลที่สมบูรณ์ เพราะอย่าลืมว่า การวัดค่า มันก็มี error (ความคลาดเคลื่อน) ในการวัดด้วย ดังนั้น หากจะมีข้อมูลที่ไม่สมบูรณ์ หรือไม่ถูกต้องบ้าง ก็ไม่ใช่เรื่องแปลกครับ


ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า

การเปรียบเทียบข้อมูล