คือ ปัญหาที่เกิดจากหน่วยความจำระหว่างเรียกเมท็อดไม่พอ จนเกิดปัญหา Stack overflow หรือปัญหาสแตกล้นขึ้น (อธิบายสั้น ๆ คือ การจองใช้หน่วยความจำจนเต็ม) ปัญหานี้มาจากความผิดพลาดของผู้เขียนโปรแกรมเอง ที่ไม่มีการออกแบบโปรแกรมและตรวจสอบให้ดี
ในภาษาไพทอนเองมีปัญหา Stack overflow เช่นเดียวกันกับภาษาอื่น ๆ (C/C++, JAVA, C# และภาษาอื่น ๆ)
ตัวอย่างโค้ดไพทอนที่มีปัญหา Stack overflow
คำเตือน!
สำหรับการทดลองโค้ดที่มีปัญหา Stack overflow ในภาษาไพทอนนี้ ไม่แนะนำให้เพิ่มจำนวนตัวเลขในคำสั่ง print(deepnesting(100000)) เด็ดขาด เพราะอาจจะทำให้คอมค้างได้ทันทีหลังโค้ดนี้ ทางผู้เขียนไม่รับผิดชอบความเสียหายที่อาจเกิดขึ้นจากการรันโค้ดนี้
def deepnesting(depth): r = {} for i in range(depth): n = {} n[i] = r r = n return r
เมื่อนำโค้ดนี้ไปรันบน CPython จะพบว่า
CPython จะเด้งออกและหยุดการทำงานไปเลย เพราะเราไม่สามารถสร้างข้อมูลชนิด Dict ช้ำกันมากเกินไปได้
หากนำโค้ดนี้ไปลองรันบน PyPy interpreter จะแสดงข้อผิดพลาดออกมา
Traceback (most recent call last): File "", line 1, in RuntimeError: maximum recursion depth exceeded
แต่ PyPy interpreter กลับยังไม่เด้งออก และยังสามารถทำงานรอรับคำสั่งต่อไปได้ตามปกติ
แนวทางการป้องกันปัญหา Stack overflow
ตรวจเช็คโค้ดไพทอน โครงสร้างโปรแกรม และทำ Test เสมอ
"มีข้อผิดพลาดอย่างน้อยหนึ่งที่ที่ยังหาไม่พบในโปรแกรมเสมอ"
"โปรแกรมที่ไม่มี Bug คือ โปรแกรมที่ยังไม่ได้ถูกเขียน"
แต่ Bug น้อยดีกว่า Bug มากนะครับ
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ
0 ความคิดเห็น:
แสดงความคิดเห็น
แสดงความคิดเห็นได้ครับ :)