Python学习笔记(二十一)--异常处理

一、什么是异常?
  异常就是python程序执行过程中发生的错误!
二、异常的处理
  python解释器在执行程序过程总,检测到了一个错误,触发异常(也允许程序员自己触发异常),异常触发后在没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行。这样就导致我们的程序奔溃或者无法执行。异常处理就是程序员编写特定的代码(这段代码与程序逻辑无关,与异常处理有关),在程序报错后去捕捉这个报错异常并进行处理使程序可以正常执行。
  注:程序运行中的异常可以分为两类:语法错误和逻辑错误。我们需要知道,语法错误跟异常处理无关,所以我们在处理异常之前,必须避免语法上的错误。
三、异常捕获及处理的几种方式?
第一种方式:异常捕捉可以使用 try/except 语句。

格式:
try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
工作方式:
  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
  • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
  • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
举例:判断用户输入的内容是否为数字,如果输入的是数字程序不报错;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”
1 try:
2     a = int(input('>>>>'))
3 except ValueError:
4     print('请输入一个数字!')
注意:
1、一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。只有满足特定条件才会执行后续的代码块;
1 try:
2     a = int(input('>>>>'))
3 except ValueError:
4     print('请输入一个数字!')
5 except NameError:
6     print('请输入正常的名字!')
2、一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,只要程序的抛出的异常存在在except元组中,就会执行except后的代码块
1 try:
2     a = int(input('>>>>'))
3 except (NameError,ValueError):
4     print('请输入一个数字!')
3、except子句可以忽略异常的名称,它将被当作通配符使用。可以使用这种方法打印一个错误信息,然后再次把异常抛出。
1 try:
2     a = int(input('>>>>'))
3 except :
4     print('请输入一个数字!')
5     raise #抛出异常信息
4、万能异常处理可以在except后添加Exception,他可以捕获任意异常;
1 try:
2     a = int(input('>>>>'))
3 except Exception :
4     print('请输入一个数字!')
注意:
  1、如果我们想要的效果是,无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,那么只有一个Exception就足够了
  2、如果我们想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支来进行准确的处理。我们可以使用多分支+万能异常来处理异常。使用多分支优先处理一些能预料到的错误类型,一些预料不到的错误类型应该被最终的万能异常捕获。需要注意的是,万能异常一定要放在最后,否则就没有意义了。
 
5、别名的使用:可以使用except与as+变量名 搭配使用,打印变量名会直接输出报错信息
1 try:
2     a = int(input('>>>>'))
3 except Exception as e:
4     print('请输入一个数字!')
5     print(e)
第二种方式:try/except...else
try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
else:
没有异常时执行的代码
工作方式:
  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
  • 如果没有异常发生,忽略 except 子句,try 子句执行后执行else语句后的代码块。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,执行完后else语句不执行。
举例:判断用户输入的内容是否为数字,如果输入的是数字程序不报错并给出输入正确的提示;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”
1 try:
2     a = int(input('>>>>'))
3 except ValueError:
4     print('请输入一个数字!')
5 else:
6     print('输入正确!')
第三种方式:try-finally语句,try-finally 语句无论是否发生异常都将执行最后的代码。
格式:
1 try:
2      被检测的代码块
3 except 异常类型:
4      try中一旦检测到异常,就执行这个位置的逻辑
5 else6 没有异常时执行的代码
7 finally:
8 不管有没有异常都执行的代码块
工作方式:
  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
  • 如果没有异常发生,忽略 except 子句,try 子句执行后执行else语句后的代码块,然后在执行finally语句块。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行,执行完后else语句不执行,finally语句块被执行。
举例说明:判断用户输入的内容是否为数字,如果输入的是数字程序不报错并给出输入正确的提示;如果输入的内容非数字,测程序抛出异常“请输入一个数字!”,最后不管是否报异常我都给出谢谢的提示信息
1 try:
2     a = int(input('>>>>'))
3 except ValueError:
4     print('请输入一个数字!')
5 else:
6     print('输入正确!')
7 finally:
8     print('Thank You!')
四、主动抛出异常
Python 使用 raise 语句抛出一个指定的异常。
格式:raise [Exception [, args [, traceback]]]
举例:如果 x 大于 5 就触发异常:
1 x = 10
2 if x > 5:
3     raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
执行以上代码会触发异常:
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。
举例:
1 try:
2     a = int(input('>>>>'))
3 except ValueError:
4     print('请输入一个数字!')
5     raise 
6 else:
7     print('输入正确!')
8 finally:
9     print('Thank You!')
执行结果:
>>>>a
请输入一个数字!
Thank You!
Traceback (most recent call last):
  File "D:/test_hub/learngit/post_test.py", line 67, in <module>
    a = int(input('>>>>'))
ValueError: invalid literal for int() with base 10: 'a'
五、用户自定义异常
你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:
 1 class MyError(Exception):
 2     def __init__(self, value):
 3         self.value = value
 4 
 5     def __str__(self):
 6         return repr(self.value)
 7 try:
 8     raise MyError(2*2)
 9 except MyError as e:
10     print('My exception occurred, value:', e.value)

posted on 2021-05-28 16:23  随风迎  阅读(173)  评论(0编辑  收藏  举报

导航