Python基礎入門(7)- Python異常處理機制

葛老頭發表於2021-12-20

1.初識異常

1.1.什麼是異常與異常處理

  • 異常就是錯誤
  • 異常會導致程式崩潰並停止執行
  • 能監控並捕獲異常,將異常部位的程式進行修理使得程式繼續正常執行

1.2.異常的語法

 1 # coding:utf-8
 2 
 3 def upper(str_data):
 4     new_str='None'
 5     try:
 6         new_str=str_data.upper()
 7     except:
 8         print('程式出錯了')
 9     return new_str
10 
11 result=upper(123)
12 print(result)
13 '''
14 程式出錯了
15 None
16 '''

1.3.捕獲通用異常

 1 # coding:utf-8
 2 
 3 def upper(str_data):
 4     new_str='None'
 5     try:
 6         new_str=str_data.upper()
 7     except Exception as e:
 8         print('程式出錯了:{}'.format(e))
 9     return new_str
10 
11 result=upper(123)
12 print(result)
13 '''
14 程式出錯了:'int' object has no attribute 'upper'
15 None
16 '''

1.4.捕獲具體異常

 1 # coding:utf-8
 2 
 3 def test():
 4     try:
 5         print("try start")
 6         1/0
 7         print("try finish") #這句程式碼不會執行,因為1/0已經報錯了,直接進入到exception中了
 8     except ZeroDivisionError as e:
 9         print(e)
10 test()
11 '''
12 try start
13 division by zero
14 '''
 1 # coding:utf-8
 2 
 3 def test():
 4     try:
 5         print("try start")
 6         print(name)
 7         print("try finish")
 8     except ZeroDivisionError as e:      #except捕獲的異常要與實際發生的異常一致,才能捕獲到,不然沒有用;捕獲的是1/0的報錯,實際發生的錯誤是name變數未定義
 9         print(e)
10 test()
11 '''
12 Traceback (most recent call last):
13   File "D:/WorkSpace/Python_Study/test01.py", line 10, in <module>
14     test()
15   File "D:/WorkSpace/Python_Study/test01.py", line 6, in test
16     print(name)
17 NameError: name 'name' is not defined
18 try start
19 '''

 


1.5.捕獲多個異常

 

2.python內建異常函式

異常型別集合
異常名稱 說明
Exception 通用異常型別(基類)
ZeroDivisionError 不能整除0
AttributeError 物件沒有這個屬性
IOError 輸入輸出操作失敗
IndexError 沒有當前的索引
KeyError 沒有這個鍵值(key)
NameError 沒有這個變數(未初始化物件)
SyntaxError Python語法錯誤
SystemError 直譯器的系統錯誤
VauleError 傳入的引數錯誤

 

3.異常中的finally

finally的功能:

  • 無論是否發生異常,一定會執行的程式碼塊
  • 在函式中,即便在try或except中進行了return也依然會執行finally語法快
  • try語法至少要伴隨except或finally中的一個
  • 語法:
    Python基礎入門(7)- Python異常處理機制
    try:
    
        <>
    
    except:
    
        <>
    
    finally<>
    View Code
 1 # coding:utf-8
 2 
 3 def test():
 4     try:
 5         return "try"
 6     except:
 7         return "except"
 8     finally:
 9         return "finally"
10     
11 print(test())       #finally

 

4.自定義異常

4.1.自定義丟擲異常raise

raise:將資訊以報錯的形式丟擲

 1 # coding:utf-8
 2 
 3 def test(number):
 4     if number==100:
 5         raise ValueError("number不能等於100")
 6     return number
 7 print(test(50))         #50
 8 print(test(100))
 9 '''
10 Traceback (most recent call last):
11   File "D:/WorkSpace/Python_Study/test01.py", line 8, in <module>
12     print(test(100))
13   File "D:/WorkSpace/Python_Study/test01.py", line 5, in test
14     raise ValueError("number不能等於100")
15 ValueError: number不能等於100
16 '''
 1 # coding:utf-8
 2 
 3 # 知識點1:raise主動丟擲的異常可以被正常捕獲
 4 def test(number):
 5     if number==100:
 6         raise ValueError("number不能等於100")
 7     return number
 8 
 9 def test1(number):
10     try:
11         return test(number)
12     except ValueError as e:
13         return e
14 
15 print(test1(100))       #number不能等於100
 1 # coding:utf-8
 2 
 3 # 知識點2:raise語法後面沒有進行異常型別的傳遞,直接跟字串,編譯器報錯,必須得加,如果不知道異常型別,使用基類Exception
 4 def test():
 5     raise "報錯了"
 6 
 7 print(test())
 8 '''
 9 Traceback (most recent call last):
10   File "D:/WorkSpace/Python_Study/test01.py", line 7, in <module>
11     print(test())
12   File "D:/WorkSpace/Python_Study/test01.py", line 5, in test
13     raise "報錯了"
14 TypeError: exceptions must derive from BaseException
15 '''

4.2.自定義異常類

 1 # coding:utf-8
 2 
 3 class NumberLimitError(Exception):
 4     def __init__(self,message):
 5         self.message = message
 6 
 7 class NameLimitError(Exception):
 8     def __init__(self,message):
 9         self.message = message
10 
11 def test(name):
12     if name=="張三":
13         raise NameLimitError("張三不可以被填寫")
14     return name
15 
16 def test1(number):
17     if number > 100:
18         raise NumberLimitError("數字不能大於100")
19     return number
20 
21 try:
22     test("張三")
23 except NameLimitError as e:
24     print(e)
25 '''
26 張三不可以被填寫
27 '''
28 
29 try:
30     test1(105)
31 except NumberLimitError as e:
32     print(e)
33 '''
34 數字不能大於100
35 '''

 

5.斷言

5.1.斷言的功能---assert

assert斷言:用於判斷一個表示式,在表示式條件為false時觸發異常

  • raise是生硬的丟擲異常
  • assert是先進行判斷然後根據結果決定是否丟擲

 


5.2.斷言得用法---assert

 1 # coding:utf-8
 2 
 3 def test(name):
 4     assert name in ["張三","李四"],"{}不在學生列表中".format(name)
 5     print("{}在學生列表中".format(name))
 6 test("張三")      #張三在學生列表中
 7 test("王五")
 8 '''
 9 Traceback (most recent call last):
10   File "D:/WorkSpace/Python_Study/test01.py", line 7, in <module>
11     test("王五")
12   File "D:/WorkSpace/Python_Study/test01.py", line 4, in test
13     assert name in ["張三","李四"],"{}不在學生列表中".format(name)
14 AssertionError: 王五不在學生列表中
15 '''

 

6.python中的除錯方法

百度一搜一大堆,我給大家分享一下我看的資料,比較老了,但是很全,最新版的Pycharm可以適用裡面的操作

https://blog.csdn.net/pansaky/article/details/85165609?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.opensearchhbase&spm=1001.2101.3001.4242.2

相關文章