21 มีนาคม 2558

Published มีนาคม 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
ตัวอย่าง


>>> print "Hi"
File "<stdin>", line 1
print "Hi"
^
SyntaxError: invalid syntax


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

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

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


>>> 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


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


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


Exception Errors

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

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


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

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


    >>> try:
    ...  import mom
    ... except ImportError:
    ...  print("No")
    ...
    No

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


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

    Enter a number:
    g
    numbers only

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


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

  5. KeyboardInterrupt
    เมื่อการกระทำกับปุ่ม interrupt ของคีย์บอร์ด (Control-C หรือ Delete)

    def foo():
      try:
       x=0
       while 1:
        x += 1
       print(x)
      except KeyboardInterrupt:
       print("Interrupted!")
    foo()

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

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


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


ตัวอย่าง


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


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


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


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


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


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

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

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

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