一般的语法错误都能在编译器中提示出来,但是下面代码里的除零错误。
def chu(a,b):
return a / b
print(chu(1,2))
# 0.5
print(chu(1,0))
# ZeroDivisionError: division by zero
像这种可能出现错误的代码,可以用try进行检测,有异常出现,就进入except里(可以加多个except,也可以声明except的类型),后面可以加finally,里面是无论有没有异常都会执行的代码,最后可以加else,else是没有任何异常时执行的代码。
def chu():
try:
a = int(input("num a :"))
b = int(input("num b :"))
res = a / b
except ValueError:
print("必须输入数字!")
except ZeroDivisionError:
print("除数不能为零!")
except:
print("未知错误!")
chu()
# 输入 122 a
# 必须输入数字!
# 输入 122 0
# 除数不能为零!
多个exception的处理顺序:
def chu():
try:
a = int(input("num a :"))
b = int(input("num b :"))
res = a / b
with open(r"C:\Users\向锦辉\Desktop\pytest\1.txt",'r') as rstream:
print(rstream.read())
except ValueError:
print("必须输入数字!")
except ZeroDivisionError:
print("除数不能为零!")
except Exception as err:
print("出错了!错误原因:{}".format(err))
except FileNotFoundError:
print("文件找不到!")
chu()
# 输入 1 1
# 输出 出错了!错误原因:错误原因:[Errno 2] No such file or directory: 'C:\\Users\\Desktop\\pytest\\1.txt'
这里是从上到下按步骤查找exception,exception中包含了filenotfounderror,所以当执行到exception时就会把异常认定为exception,从而不会进行下面的判断了,如果把在后面加上 as err就会把异常的类型赋值给err,可以把发生的错误记录。所以在使用异常操作时,要把大类的异常向下放,把由大类异常派生出的小类往上放。
注意: try中的某些变量在finally中可能无法使用,因为try,finally中的语句相当于是两个模块中的,就像一个函数和另一个函数里的变量一样。如果try和catch语句中如果要同时使用一个变量的话,可以先在他们外部声明一下。
抛出异常:
def resister():
username = input("输入用户名:")
if len(username) < 6:
raise Exception("用户长度必须6为以上!")
else:
print("输入的用户名是:",username)
try:
resister()
except Exception as err:
print(err)
print("注册失败!")
else:
print("注册成功!")
用 raise 将异常抛出。