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
沒有留言:
張貼留言