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继承结构

Python基础 - 08异常_运算符