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