錯誤和異常
錯誤
- 語法錯誤(invalid syntax)
- 邏輯錯誤(logic error)
- 執行期間錯誤(runtime error)
while True
print(1)
out:
while True
^
SyntaxError: invalid syntax
python的語法分析器完成,檢測到錯誤所在文件和行號,以向上箭頭標記錯誤位置。最後顯示錯誤類型。當程序檢測到一個錯誤,解釋器就無法繼續執行,拋出異常,終止程序。
異常
- 系統根據不同的錯誤,拋出不同的異常。
>>> 1/0
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
1/0
ZeroDivisionError: division by zero`
- 常見的異常
異常 | 描述 |
---|---|
NameError | 嘗試訪問一個沒有申明的變量 |
ZeroDivisionError | 除數爲 0 |
SyntaxErro | 語法錯誤 |
IndexError | 索引超出序列範圍 |
KeyError | 請求一個不存在的字典關鍵字 |
FileNotFoundError | 文件未發現錯誤(比如你要讀的文件不存在) |
AttributeError | 嘗試訪問未知的對象屬性 |
ModuleNotFoundError | 模塊未發現 |
IndentationError | 縮進 |
異常處理
-
程序一旦發生錯誤,程序就無法繼續運行,爲了讓程序健壯,可做相關異常處理
-
try …except…
try: try_statements嘗試執行語句 except [exceptionType [as identifier]]: except_statements [else: else_statements] [finally: finally_statements]
-
try子句
- try … except 必須放在可能發生異常的程序段周圍,而try_statements則是可能發生異常的程序段。
-
except子句 做不同的處理,可以使用多個except子句,其中,exceptionType是欲捕捉的異常類型,省略不寫,表示爲預設類型:BaseException,所有異常都繼承自該類別。
-
[as identifier]可以將捕捉到的異常指向一個變量,然後,通過該變量獲得異常相關的信息。
-
不帶任何異常類型使用except,將捕獲所有發生的異常。不推薦這麼使用,因爲我們不能通過該程序識別出具體的異常信息。
-
-
else子句
-
當try_statements沒有異常發生時,會跳過except子句,執行else_statements。
-
該子句爲可選語句,可以指定或者省略。
-
-
finally子句
- 當要離開try … except 時(無論異常是否發生),就會執行finally_statements,可以使清除錯誤或者收尾的語句。可給可忽略。
-
try:
a=eval(input('請輸入被除數:'))
b=eval(input('請輸入除數:'))
c=a/b
except ZeroDivisionError as e:
print(e.args)
except NameError:
print('請注意變量是否賦值')
except TypeError as e :
print(e.args)
else:
print('a/b=',a/b)
finally:
print('再見')
結果
請輸入被除數:1
請輸入除數:0
('division by zero',)
再見
---------------------------------------
請輸入被除數:1
請輸入除數:b ####並不將b作字符串,而是將其當作變量名
請注意變量是否賦值
再見
---------------------------------------
請輸入被除數:2, ####默認返回元組
請輸入除數:7
("unsupported operand type(s) for /: 'tuple' and 'int'",)
再見
try:
a=eval(input('請輸入被除數:'))
b=eval(input('請輸入除數:'))
c=a/b
except (ZeroDivisionError,NameError,TypeError )as e:
print(e.args)
else:
print('a/b=',a/b)
finally:
print('再見')
結果
請輸入被除數:+ ###爲預設的錯誤類型
再見
Traceback (most recent call last):
File "C:/Users/12273/Desktop/python/text.py", line 2, in <module>
a=eval(input('請輸入被除數:'))
File "<string>", line 1
+
^
SyntaxError: unexpected EOF while parsing
--------------------------------------------------
請輸入被除數:0
請輸入除數:0
('division by zero',)
再見
注:上述程序發生預設以外的錯誤,依然會報錯,可以在except(exceptionType)之後,再跟一個except:()捕捉其他未知異常,當之前預設異常出發後,該語句不會執行,當發生未預設的異常後,纔會執行該語句.
觸發異常(raise)
除了系統拋出的異常,我們可以用raise語句自己去觸發異常。
格式:
raise [Exception[,args [,traceback]]]
Exception:異常類型
args:我們自己提供的異常參數
traceback:可選,如果存在,跟蹤異常對象
try:
raise NameError('Sorry,Error occurs!!!!')
except NameError:
print('it\'s over')
raise NameError('Sorry,Error occurs!!!!')
結果
it's over
Traceback (most recent call last):
File "C:/Users/12273/Desktop/python/text.py", line 6, in <module>
raise NameError('Sorry,Error occurs!!!!')
NameError: Sorry,Error occurs!!!!
斷言(assert)
assert condition
邏輯上相當於
if not condition:
raise AssertionError()
爲斷言添加一個異常參數
assert expression[,args]
assert 1==2
assert 1==2
AssertionError
li=[1,2]
assert len(li)>=3,'元素個數小於5'
assert len(li)>=3,'元素個數小於5'
AssertionError: 元素個數小於5