錯誤和異常

錯誤和異常

錯誤

  • 語法錯誤(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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章