Python 3.1 快速導覽 - 例外處理

寫程式難免會有錯誤 (error) ,例如以下程式

a = 22
b = 33

if a < b
    print("Hello world!")

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:err01.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


會發生 SyntaxError 也就是語法錯誤 (syntax error)



這是因為第 4 行
if a < b


我們在 if 陳述 (if statement) 漏打了冒號,直譯器 (interpreter) 在執行時便會直接抓出這個錯誤,然後停止程式的執行。


程式有可能會發生三種錯誤,語法錯誤是其中之一,有一種語意錯誤 (semantic error) ,程式會順利執行,但會得到錯誤的結果。如下例
sum = 0
i = 1
while i < 100:
    sum += i
    i += 1

print("1 + 2 + + 3 ... + 98 + 99 + 100 =", sum)

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:err02.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 


執行結果如下



此例中我們想計算 1 到 100 所有正整數的合,正確的結果應該是 5050 ,可是程式卻算出 4950 ,為什麼呢?因為第 3 行
while i < 100:


這裡的條件 (condition) 只會讓 sum 加到 99 為止,若 i 等於 100 就會結束迴圈,因此 while 迴圈 (while loop) 的結束條件應該是 i <= 100 或 i < 101 。


語法錯誤會被直譯器直接挑出,而語意錯誤需要依賴程式設計師自己清楚規劃程式的邏輯,另外一種錯誤通常在執行中發生錯誤,直譯器會以發起例外 (exception) 的方式終止程式的進行,如下例
a = 22
b = 33

if a < b:
    print(n)

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:err03.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月


執行結果如下



這裡發生的是 NameError ,這是名稱錯誤,因為程式中沒有定義過 n ,第 5 行
print(n)


沒有變數 n 的存在,所以直譯器發起 NameError 的例外。


中英文術語對照
錯誤error
語法錯誤syntax error
if 陳述if statement
直譯器interpreter
語意錯誤semantic error
條件condition
while 迴圈while loop
例外exception






沒有留言: