python异常处理

165 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天

语法错误和异常

语法错误:在写代码时报的错误

异常:我们在运行代码是报错:一般都是‘xxxError:’

这里我们重点来讲一下异常

  • 异常
def chufa(a,b):
	return a / b
chufa(1,0)	

上述代码在定义和调用时都是符合函数规则,但不难看出虽没有语法错误,但我都知道除式的分母不能为0,于是这个程序在运行时便会报错(这样的报错就被称为异常)

因此我们为此要处理异常

异常处理

都知道如果我们的代码执行中出先了错误那么下面的代码就都不能正常执行因此我们得对某些代码进行错误处理

错误处理的基本格式:

try:
	要进行的错误处理代码
except(异常类型):    # 注意可以不加异常错误
    如果错误了要运行的代码  
# 示例 四则运算计算器
def sum():
    try:
    	n1 = input('请输入一个数字:')
    	n2 = input('请输入另一个数字:')
    	per = input('请输入运算符号:')
    	if per == '+':
            return n1 + n2
        elif per == '/':
            return n1 / n2
        elif per == '*':
            return n1 * n2
        elif per == '-':
            return n1 - n2
        else:
            print('请输入正确运算符号')
    except ZeroDivisionError:
        print('除数不为0!!!')
    except ValueError:
        print('请输入数字!!!')
    
a = sum()
print('------>',a)

以上就是一个简单的错误处理

捕获异常

我们在编写程序时会有许多的报错,因此我们需要这样去做

try:
	要进行的错误处理代码
except 异常类型1:   
    如果错误了要运行的代码
except 异常类型2:   
    如果错误了要运行的代码
except 异常类型3:   
    如果错误了要运行的代码
except 异常类型4:   
    如果错误了要运行的代码
except 父类:   
    如print('出错了')   
    .......

这里的错误类型我们不可能在写程序时都能预见,所以我们会将一些其他的错误用父类进行代替,记住这里的错误类型我们必须从小类到大类依次从上到下,因为如果排序错误,将大类排到上面,我们的代码就会直接判断到大类停止,不会继续向下判断*

  • 问题

大家可能也发现了,如果我们只是用父类来进行异常处理,那我们就有很多异常得不到很好的回馈

  • 解决问题

except Exception as err(从Exception这类中找到报错的原因给err)

try:
	要进行的错误处理代码
except 异常类型1:   
    如果错误了要运行的代码
except 异常类型2:   
    如果错误了要运行的代码
except 异常类型3:   
    如果错误了要运行的代码
except 异常类型4:   
    如果错误了要运行的代码
except Excetion as err:
    print('出错了',err)
    .......

到这里我们实现了捕获异常的基本功能,注意这里的err可以用任意变量名替代,只是为了规范命名,所以我们这里采用了err

try-except-else/try-except-finally

  • try-execpt-else
try:
    要异常处理的代码
except:
    如果出错了要运行的代码
else :
    没有错误时运行的代码

注意:在这里我们要知道如果有了else我们的代码想要运行else的前提是我们的try内没有return

  • try-except-finally
try:
    要异常处理的代码
except:
    如果出错了要运行的代码
finally:
	无论是否有异常都运行

注意:只要finally有return值,那么不管上面有没有return,我们返回的都是finally内部的return(你只要理解finally因为无论对错必须运行,所以return1会被return3覆盖)

抛出异常 (raise)

这里因为系统没有你想要的异常所以在这里我们要自己抛出异常

示例

def register():
    username = input('输入用户名:')
    if len(username) < 6:        #这里本来是一个自定义异常类(这里用的是他的父类)
        raise Execption('用户名长度必须大于6位')
    else:
        print('用户名为:',username)
        
try:
    register()
except Excetion as err:
    print(err)
    print('注册失败')
else: 
    peint('注册成功')