錯誤和異常
錯誤
- 語法錯誤(syntax error)
- 邏輯錯誤(logic error)
- 執行期間錯誤(runtime error)
for i in range()
File "D:/python/test1/day06.py", line 3
for i in range()
^
SyntaxError: invalid syntax
python的語法分析器完成,檢測到錯誤所在文件和行號。以向上箭頭標記錯誤位置。最後顯示錯誤類型。
當程序檢測到一個錯誤,解釋器就無法繼續執行下去,拋出異常,終止程序。
異常
系統根據不同的錯誤,拋出不同的異常。
常見異常:
異常 | 描述 |
---|---|
NameError | 嘗試訪問一個沒有申明的變量 |
ZeroDivisionError | 除數爲 0 |
SyntaxError | 語法錯誤 |
IndexError | 索引超出序列範圍 |
KeyError | 請求一個不存在的字典關鍵字 |
FileNotFoundError | 文件未發現錯誤(比如你要讀的文件不存在) |
AttributeError | 嘗試訪問未知的對象屬性 |
ModuleNotFoundError | 模塊未發現 |
IndentationError | 縮進 |
#NameError
print(a)
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 6, in <module>
print(a)
NameError: name 'a' is not defined
#ZeroDivisionError
1/0
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 7, in <module>
1/0
ZeroDivisionError: division by zero
#SyntaxError
for i in range()
File "D:/python/test1/day06.py", line 3
for i in range()
^
SyntaxError: invalid syntax
#IndexError
li = []
li[2]
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 9, in <module>
li[2]
IndexError: list index out of range
#KeyError
dic = {}
dic['age']
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 11, in <module>
dic['age']
KeyError: 'age'
#FileNotFoundError
f = open('./test.txt', 'r')
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 13, in <module>
f = open('./test.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: './test.txt'
#AttributeError
a = "str"
a.name
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 24, in <module>
a.name
AttributeError: 'str' object has no attribute 'name'
#ModuleNotFoundError
import ssss
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 23, in <module>
import ssss
ModuleNotFoundError: No module named 'ssss'
#IndentationError
a = 10
File "D:/python/test1/day06.py", line 23
a = 10
^
IndentationError: unexpected indent
異常處理
程序一旦發生錯誤,程序就無法繼續運行。
爲了使程序健壯,可做相關異常處理。
try…except…
try:
try_statements
except[exceptionType [as identifier]]:
except_statements
[else:
else_statements]
[finally:
finally_statements]
- try子句
- try … except 必須放在可能發生異常的程序段周圍,而try_statements則是可能發生異常的程序段。
- except子句
- 用來捕捉指定的異常,一旦捕捉到,就執行與之對應的except_statements,即用來處理異常的程序語句。
- 如果要針對不同的異常做不同的處理,可以使用多個except子句,其中,exceptionType是欲捕捉的異常類型,省略不寫,表示爲預設類型:BaseException,所有異常都繼承自該類別。
- [as identifier]可以將捕捉到的異常指向一個變量,然後,通過該變量獲得異常相關的信息。
- 不帶任何異常類型使用except,將捕獲所有發生的異常。不推薦這麼使用,因爲我們不能通過該程序識別出具體的異常信息。
- else子句
- 當try_statements沒有異常發生時,會跳過except子句,執行else_statements。
- 該子句爲可選語句,可以指定或者省略。
- finally子句
- 當要離開try … except 時(無論異常是否發生),就會執行finally_statements,可以使清除錯誤或者收尾的語句。可給可忽略。
try…except小結
-
帶多個except的try語句
-
try: ... except exception1: ... except exception2: ...
-
-
處理多個異常的except語句
-
try: ... except (exception1, exception2, ..., ) as e: ...
-
-
捕獲所有異常
-
try: ... except Exception as e: ... try: ... except: ...
-
demo:
try:
X = eval(input("請輸入被除數x:\t"))
Y = eval(input("請輸入除數y:\t"))
Z = X/Y
except ZeroDivisionError:
print("除數不可爲零")
except NameError:
print("請檢查變量是否賦值")
else:
print("未捕捉到異常,X/Y=", Z)
finally:
print("執行結束")
請輸入被除數x: 12
請輸入除數y: 2
未捕捉到異常,X/Y= 6.0
執行結束
請輸入被除數x: 112
請輸入除數y: 0
除數不可爲零
執行結束
請輸入被除數x: 122
請輸入除數y: a
請檢查變量是否賦值
執行結束
try:
X = eval(input("請輸入被除數x:\t"))
Y = eval(input("請輸入除數y:\t"))
Z = X/Y
except (ZeroDivisionError, NameError, TypeError) as e:
print(e.args)
else:
print("未捕捉到異常,X/Y=", Z)
finally:
print("執行結束")
請輸入被除數x: 12
請輸入除數y: 0
('division by zero',)
執行結束
raise(觸發異常)
除了系統拋出的異常,我們可以用raise語句自己觸發異常。
格式:
raise [Exception [, args [, traceback]]]
- Exception:異常類型
- args:我們自己提供的異常參數
- traceback:可選,如果存在,跟蹤異常對象。
raise NameError("Sorry, Error Occurs.")
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 37, in <module>
raise NameError("Sorry, Error Occurs.")
NameError: Sorry, Error occurs
try:
raise NameError("Sorry, Error Occurs.")
except NameError:
print("NameError")
#NameError
assert(斷言)
assert condition
邏輯上相當於:
if not condition:
raise AssertionError()
assert 1 == 1
assert 1 == 0
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 41, in <module>
assert 1 == 0
AssertionError
爲斷言添加一個異常參數()
assert expression [, args] # arguments參數
li = [1, 2]
assert len(li) >= 5, "列表元素小於5"
Traceback (most recent call last):
File "D:/python/test1/day06.py", line 41, in <module>
assert len(li) >= 5, "列表元素小於5"
AssertionError: 列表元素小於5