21 มีนาคม 2558

Published 3/21/2558 by with 0 comment

การจัดการข้อผิดพลาดในภาษา Python

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

ข้อผิดพลาดในภาษา Python


ข้อผิดพลาดในภาษา Python ในการเขียนโปรแกรมมีอยู่ 2 ชนิด คือ

  1. Syntax Errors

  2. Exceptions


1. Syntax Errors

เป็นการเขียนผิดหลักไวยากรณ์ของภาษา Python มักจะพบบ่อย เมื่อลืมใส่วงเล็บหรือใช้คำสั่งผิด import ไลบรารีผิด หรือนำโค้ด Python 2 มารันบน Python 3
ตัวอย่าง

[python]
>>> print "Hi"
File "<stdin>", line 1
print "Hi"
^
SyntaxError: invalid syntax
[/python]

2. Exceptions
แม้ว่าจะเขียนโค้ดโปรแกรมถูกหลักไวยากรณ์ของภาษา Python แต่หากจะมีปัญหาในการดำเนินการทำงานของโปรแกรม เช่น ใช้ชนิดของตัวแปรผิด

ตัวอย่างของปัญหานี้คือ ZeroDivisionError, NameError และ TypeError

ตัวอย่างข้อผิดพลาดนี้

[python]
>>> a = 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: Attempted to divide by zero.

>>> b+5/1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

>>> "5"-1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
[/python]





การจัดการข้อผิดพลาดในภาษา Python


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

[python]
try:
คำสั่งรันโปรแกรม
except:
คำสั่งเมื่อพบปัญหาจากคำสั่งที่รัน
[/python]

Exception Errors

ที่ควรรู้มีดังนี้ครับ

  1. IOError
    ไม่สามารถเปิดไฟล์ได้

    [python]
    >>> try:
    ... open('a.txt','r')
    ... except IOError:
    ... print("IOError")
    ...
    IOError
    [/python]


  2. ImportError
    ไม่พบไลบรารีที่ระบุไว้

    [python]
    >>> try:
    ... import mom
    ... except ImportError:
    ... print("No")
    ...
    No
    [/python]


  3. ValueError
    ชนิดของค่าที่ได้จากการตัวดำเนินการหรือฟังก์ชั่นจากอาร์กิวเมนต์ไม่เหมาะสม

    [python]
    >>> try:
    a = int(input("Enter a number:\n"))
    except ValueError:
    print("numbers only")

    Enter a number:
    g
    numbers only
    [/python]


  4. ZeroDivisionError
    เป็นข้อผิดพลาดที่พบเมื่อคุณนำค่าจำนวนเต็มหรือจำนวนจริงหารด้วย 0 เพราะการหารด้วย 0 ไม่สามารถหารได้

    [python]
    >>> try:
    ... a = 6/0
    ... except ZeroDivisionError:
    ... print("ZeroDivisionError")
    ...
    ZeroDivisionError
    [/python]

  5. KeyboardInterrupt
    เมื่อการกระทำกับปุ่ม interrupt ของคีย์บอร์ด (Control-C หรือ Delete)
    [python]
    def foo():
    try:
    x=0
    while 1:
    x += 1
    print(x)
    except KeyboardInterrupt:
    print("Interrupted!")
    foo()
    [/python]


สำหรับรายการ Exception Errors สามารถอ่านเพิ่มเติมได้ที่ https://docs.python.org/3/library/exceptions.html

Try ... except ... else
หลังจากที่เรากำหนดการทำงาน Exception Errors แล้ว หากเรารันโปรแกรมแล้วไม่พบข้อผิดพลาดที่เราได้กำหนดไว้ เราสามารถใช้บล็อก else ทำงานตามเงื่อนไขที่กำหนดไว้ได้

[python]
try:
คำสั่งรันโปรแกรม
except:
คำสั่งเมื่อพบปัญหาจากคำสั่งที่รัน
else:
คำสั่งเมื่อไม่พบปัญหาจากการรันโปรแกรม
[/python]

ตัวอย่าง

[python]
>>> try:
... import sys
... except ImportError:
... print("Import Error")
... else:
... print("Hello : )")
...
Hello : )
[/python]

finally
เป็นการกำหนดคำสั่งเมื่อสิ้นสุดการทำงานบล็อก try except โดยบล็อก finally จะทำงานไม่ว่าจะมีข้อผิดพลาดเกิดขึ้นหรือไม่ก็ตาม

[python]
try:
คำสั่งรันโปรแกรม
except:
คำสั่งเมื่อพบปัญหาจากคำสั่งที่รัน
finally:
คำสั่งสิ้นสุดการทำงานหลังจากบล็อก try except
[/python]

ตัวอย่างการใช้งาน

[python]
try:
a = 6 / 0
except:
print("Error")
finally:
print("Good Bye. :(")
[/python]

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)