python之异常处理方式,报错怎么办,别慌

文章目录

    • 异常是什么
    • 处理异常
      • 异常的传播
      • 异常捕获try ... except ...
        • 异常捕获之锁定异常类型
          • Exception
          • 异常名
          • else
          • finally
            • 完整异常捕获语法:
      • 报错锦集参考

异常是什么

程序在运⾏过程中可能会出现⼀些错误。

⽐如: 使⽤了不存在的索引,两个不 同类型的数据相加…这些错误我们称之为异常 处理异常
当一段代码出现报错或者运行结果达不到想要的结果时,证明这段代码出现了异常,就需要去寻找代码中的异常。

例如:

code = input('请输入验证ID:')
if code == 3547:
    print('验证成功!')
else:
    print('验证失败!')
请输入验证ID:3547
验证失败!

上面这段代码,不管怎么输入都不会打印’验证成功!’

因为打印’验证成功!'的条件是code == 3547,而input()获取到的结果只能是字符串,也就是说code一定为字符串格式,所以条件不可能成立

尽管这段代码不会出现报错的情况,但依然是一段异常代码

所以修复的方式有两种:

1、将code转换成整数型

2、将3547改为字符串格式

处理异常

通常有了异常之后我们会找出错误原因来进行相应修改,但是由于使用的种种原因,还是会有异常出现

但是有时候如果因为一部分代码运行出错影响全局就得不偿失了,当然有时候我们在有错时也需要让
程序继续运行,比如有时候我们在输入QQ密码时,输入密码错误时希望看到的是密码输入错误请重新输入而不是QQ软件崩溃

print('hello python')
print(hello)
print('hello java')
hello python
Traceback (most recent call last):
NameError: name 'hello' is not defined

程序运⾏时出现异常,⽬的并不是让我们的程序直接终⽌!Python 是希望在出现异常时,我们可以编写代码来对异常进⾏处理

异常的传播

  • 当在函数中出现异常时,如果在函数中对异常进⾏了处理,则异常不会在进 ⾏传播。
  • 如果函数中没有对异常进⾏处理,则异常会继续向函数调⽤传播。
  • 如果函数调⽤处处理了异常,则不再传播异常,如果没有处理则继续向调⽤ 处传播。直到传递到全局作⽤域(主模块)如果依然没有处理,则程序终⽌,并 显示异常信息。
  • 当程序运⾏过程中出现异常以后,所有异常信息会保存到⼀个异常对象中。 ⽽异常传播时,实际上就是异常对象抛给了调⽤处
    例如:
print('hello python')
def f1():
    print(hello)
    print('hello java')
def f2():
    print('hello C')
def f3():
    print('hello C++')
f1()
f2()
f3()
hello python
Traceback (most recent call last):
  File "/tmp/python/20200806/5f27600/main.py", line 9, in <module>
    f1()
  File "/tmp/python/20200806/5f27600/main.py", line 3, in f1
    print(hello)
NameError: name 'hello' is not defined

有时候我们写代码运行时会发现报了很多错,一看就开始头疼,但是其实可能并没有那么多错,只是因为其中一个异常导致了其他异常,这就是异常传播了,寻找源头错误就很好解决了

异常捕获try … except …

对可能出现报错情况的代码进行异常捕获,不让其出现报错情况

语法:

try:
	代码块
except:
	代码块执行出错后的操作

示例:

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except:
    print('输入的内容做为除数,所以不能输入0哦!')
请输入一个整数:0
输入的内容做为除数,所以不能输入0哦!

当输入的内容不为数字或者为0时程序就会报错,这时用try语句捕获到异常,再通过except语句提示报错后需要进行的操作

异常捕获之锁定异常类型

上面的代码可以捕获异常让代码继续执行,但是:

请输入一个整数:f
输入的内容做为除数,所以不能输入0哦!

我们忽然又发现,如果输入其它的会使程序报错的字符进去依然会打印输入为0时的错误警告,那么怎么办呢,我们可以锁定报错来应对不同的错误
语法:

try:
	代码块
except 异常提示符:
	代码块执行出该类型异常后的操作
except 异常提示符:
    代码块执行出该类型异常后的操作
except 异常提示符:
    代码块执行出该类型异常后的操作

实例:

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError:
    print('输入的内容做为除数,所以不能输入0哦!')
except ValueError:
    print('输入内容只能是整数哟')
请输入一个整数:f
输入内容只能是整数哟
请输入一个整数:3.3
输入内容只能是整数哟
请输入一个整数:0
输入的内容做为除数,所以不能输入0哦!

我们发现,在except后面添加了异常提示之后就会让相应报错后执行相应的代码块,极大提高了程序的合理性

Exception

当然,异常可能非常多,如果出现未知错误但是由于我们只能锁定已知错误的话我们可以使用Exception来捕获其它异常
例如:

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError:
    print('输入的内容做为除数,所以不能输入0哦!')

except Exception:
    print('我也不知道你是什么错误')
请输入一个整数:3.3
我也不知道你是什么错误
异常名

在捕获异常之后,有时候我们还是希望知道异常在是什么,那么如何做呢
使用as

try:
	代码块
except 异常提示符 as 异常名:
	代码块执行出该类型异常后的操作
except 异常提示符 as 异常名:
    代码块执行出该类型异常后的操作

例如:

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError as a:
    print('输入的内容做为除数,所以不能输入0哦!','异常报错:',a)
except ValueError as b:
    print('输入内容只能是整数哟','异常报错:',b)
except Exception as c:
    print('我也不知道你是什么错误','异常报错:',c)
请输入一个整数:0
输入的内容做为除数,所以不能输入0哦! 异常报错: division by zero
请输入一个整数:f
输入内容只能是整数哟 异常报错: invalid literal for int() with base 10: 'f'
else

大致的捕获异常框架我们已经出来了,但是还不完整

try:
	代码块
except 异常提示符 as 异常名:
	代码块执行出该类型异常后的操作
except 异常提示符 as 异常名:
    代码块执行出该类型异常后的操作
else :
    代码块(没出错时要执⾏的语句)

else 可用可不用,功能是没有出错时执行语句
例如:
程序出现异常,所以else语句没有执行

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError as a:
    print('输入的内容做为除数,所以不能输入0哦!','异常报错:',a)
except ValueError as b:
    print('输入内容只能是整数哟','异常报错:',b)
except Exception as c:
    print('我也不知道你是什么错误','异常报错:',c)
else:
    print('程序没有出错')
请输入一个整数:0
输入的内容做为除数,所以不能输入0哦! 异常报错: division by zero

程序正常执行,else语句执行

try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError as a:
    print('输入的内容做为除数,所以不能输入0哦!','异常报错:',a)
except ValueError as b:
    print('输入内容只能是整数哟','异常报错:',b)
except Exception as c:
    print('我也不知道你是什么错误','异常报错:',c)
else:
    print('程序没有出错')
请输入一个整数:6
3.0
程序没有出错
finally

有开始就有结束,finally

完整异常捕获语法:
try:
	代码块
except 异常提示符 as 异常名:
	代码块执行出该类型异常后的操作
except 异常提示符 as 异常名:
    代码块执行出该类型异常后的操作

......(这是省略号,别搞错哈)

else :
    代码块(没出错时要执⾏的语句)
finally:
    代码块(是否出错该代码块都会执行)
  • try是必须的,else有没有都可以,except和finally至少有一个
try:
    number = int(input('请输入一个整数:'))
    Remainder = 18 / number
    print(Remainder)
except ZeroDivisionError as a:
    print('输入的内容做为除数,所以不能输入0哦!','异常报错:',a)
except ValueError as b:
    print('输入内容只能是整数哟','异常报错:',b)
except Exception as c:
    print('我也不知道你是什么错误','异常报错:',c)
else:
    print('程序没有出错')
finally:
    print('无论有无异常,我都会执行')
请输入一个整数:3
6.0
程序没有出错
无论有无异常,我都会执行
请输入一个整数:0
输入的内容做为除数,所以不能输入0哦! 异常报错: division by zero
无论有无异常,我都会执行

报错锦集参考

报错可能性极多,就比如上面的NameError: ,博主也没有整理的锦集资料,我们可以参考官网的:
https://docs.python.org/3/library/exceptions.html

你可能感兴趣的