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 |
參考資料
http://docs.python.org/py3k/tutorial/errors.html
http://docs.python.org/py3k/reference/compound_stmts.html
http://docs.python.org/py3k/tutorial/errors.html
http://docs.python.org/py3k/reference/compound_stmts.html
沒有留言:
張貼留言