1. 程式人生 > 其它 >Python基礎 - 08異常

Python基礎 - 08異常

Python基礎 - 08異常

一、語法錯誤和異常

1.1概念

def func():
    number += 1

func() # UnboundLocalError: local variable 'number' referenced before assignment 

異常:程式執行時報出的錯誤。xxxError。 

def chu(a, b):
    return a / b

# chu(1,0) # ZeroDivisionError: division by zero

  

1.2異常處理

try: 可能出現異常的程式碼 except: 出現異常後執行的程式碼
finally: pass
異常處理結構1:

def func():
    try:
        n1 = int(input('輸入第一個數字:'))
        n2 = int(input('輸入第二個數字:'))
        sum = n1 + n2
        print('和是:', sum)
    except:
        print('輸入數字錯誤')

func()
'''
輸入第一個數字:c
輸入數字錯誤
'''

異常處理結構2: 多個Except, Exception要放在最後; except Exception as err , err的內容是錯誤資訊   

# 如果有多個except,異常型別的順序需要注意,Exception放在最後
def func1():
    try:
        n1 = int(input('輸入第一個數字:'))
        n2 = int(input('輸入第二個數字:'))
        oper = input('輸入運算子(+ - * /):')
        result = 0
        if oper == '+':
            result = n1 + n2
        elif oper == '-':
            result = n1 + n2
        elif oper == '/':
            result = n1 / n2
        elif oper == '*':
            result = n1 * n2
        else:
            print('符號輸入錯誤!')
        print('結果是:',result)

        with open(r'e://app//081.txt','r') as stream:
            lines = stream.readlines()
            print(lines)
    except ZeroDivisionError:
        print('除數不能為零')
    except ValueError:
        print('必須輸入數字')
    except Exception as err:
        print('出錯啦', err)

func1()

"""
輸入第一個數字:5
輸入第二個數字:0
輸入運算子(+ - * /):/
除數不能為零
----------------------------
輸入第一個數字:c
必須輸入數字
----------------------------
輸入第一個數字:1
輸入第二個數字:2
輸入運算子(+ - * /):+
結果是: 3
出錯啦 [Errno 2] No such file or directory: 'e://app//081.txt'
"""

  

異常處理結構3: 在try ... except ... else ...結構中,使用else則try程式碼塊中不能出現return

def func2():
    try:
        n1 = int(input('輸入數字:'))
        print(n1)
    except ValueError:
        print('輸入的不是數字')
    else:                         # 沒有異常才會執行的程式碼塊
        print('輸入完畢')

func2()
'''
輸入數字:6
6
輸入完畢
---
輸入數字:n
輸入的不是數字
'''

  

異常處理結構4: try ... except ...finally ...結構,無論是否異常,finally程式碼塊都會執行

場景:檔案操作stream = open(...) stream.read() stream.close() 資料庫操作close()

def func4():
    stream = None
    try:
        stream = open(r'e://app/081.txt','r')
        lines = stream.readlines()
        print(lines)
    except Exception as err:
        print(err)
    finally:
        print('******')
        if stream:
            stream.close()

func4()
'''
['本次的運算結果為0']
******
----------------------
[Errno 2] No such file or directory: 'e://app/081.txt'
******
'''

  

帶返回值的結構

def func5():
    stream = None
    try:
        stream = open(r'e://app/08.txt','r')
        lines = stream.readlines()
        print(lines)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print('******')
        if stream:
            stream.close()
        return 3
x = func5()
print(x)       # 無論是否報錯,都是 3

  

二、丟擲異常

raise

def register():
    username = input('請輸入使用者名稱:')
    if len(username) < 6:
        raise Exception('使用者長度必須大於6位!')
    else:
        print('輸入的使用者名稱為:', username)


register()
'''
請輸入使用者名稱:admin
Traceback (most recent call last):
  File "E:\PythonLearn\pythonBase\02door2\08-except-01.py", line 180, in <module>
    register()
  File "E:\PythonLearn\pythonBase\02door2\08-except-01.py", line 176, in register
    raise Exception('使用者長度必須大於6位!')
Exception: 使用者長度必須大於6位!
'''

  

try:
    register()
except Exception as err:
    print(err)
else:
    print('註冊成功!')
'''
請輸入使用者名稱:admin
使用者長度必須大於6位!
'''

  

Exception繼承結構