10 异常

异常

  • 为了是程序更具健壮性,在程序中遇到的可能出现的错误都要尽量被解决。对可能出现错误的代码进行处理,就是异常处理。
  • 一段代码,如果遇到异常,没有得到处理,则整个程序就会停止下来,如果进行处理,则程序往下运行。

简单的异常处理,try-except:

格式如:

try:
    # 尝试捕获异常的代码(可能会出错的代码)
except:
    # 出现异常后要执行的代码

  

异常捕获的完整语法:

在实际开发中,一段代码可能会遇到不同的错误,则针对不同的错误有不同的处理方法,这时需要如下格式处理:

try:
    # 尝试捕获异常的代码(可能会出错的代码)
except 错误类型1:
    # 出现错误类型1后要执行的代码
except (错误类型1,错误类型2):
    # 出现错误类型1和2后要执行的代码
except Exception as result:
    # 出现其它错误类型后要执行的代码(通常是告知未知错误)
else:
  #没有异常才会执行的代码
  pass
finally:
  #无论是否有异常,都要执行的代码

  

异常的传递性

程序中,如果异常没有得到处理,则会向上传递,如果一直传递到主程序还没有得到处理,则程序终止,如:

1 # 异常会向上传递直到主程序
2 class A:
3     def demo1(self):
4         return int(input("请输入一个整数"))
5     def demo2(self):
6         return demo1()
7 
8 a = A()
9 a.demo2()

  运行结果,可以看到错误从第6行传递到调用它的第9行,仍没得到解决,于是报错:

E:\python3\python3.exe F:/PycharmProjects/project3-class/xh_23_异常传递.py
Traceback (most recent call last):
  File "F:/PycharmProjects/project3-class/xh_23_异常传递.py", line 9, in <module>
    a.demo2()
  File "F:/PycharmProjects/project3-class/xh_23_异常传递.py", line 6, in demo2
    return demo1()
NameError: name 'demo1' is not defined

  

利用异常的传递性,可以直接在主程序处理异常,而不用在各个方法中处理,减少代码的复杂性。

主动抛出异常

在开发中,有时我们需要主动抛出一些,符合程序运行,但不符合需求设定的异常。

抛出异常和捕获异常是两个不同的概念。抛出异常并不代表处理好异常了,它只是把异常抛出去了而已,还需要捕获处理。

例如:如果用户输入的密码少于8位,则提示异常,并进行处理。

思路:

  • 创建一个Exception对象
  • 使用raise关键字抛出该异常(该Exception对象)

格式:自定义异常名 = Exception(“提示字符串”)  #括号中除了传递字符串,还可以传递其它参数,但是现在我还不知道能传啥

raise 自定义异常名 #主动抛出此异常

举个例子,输入一段字符串,如果字符串长度小于8则抛出异常:

def input_passwd():
    a = input("请输入密码:")
    if len(a) > 8:
        return a
    yc = Exception("密码长度不够") #实例化一个异常对象起名yc,并初始化提示信息“密码长度不够”
    raise yc1 #主动抛出异常
input_passwd()

  此时执行此程序,若输入一个长度小于8的字符串,则报错:

Traceback (most recent call last):
  File "F:/PycharmProjects/project3-class/xh_24_主动抛出异常.py", line 7, in <module>
    input_passwd()
  File "F:/PycharmProjects/project3-class/xh_24_主动抛出异常.py", line 6, in input_passwd
    raise yc1
Exception: 密码长度不够

  主动抛出的异常同样需要对其进行处理,不然报错并终止程序。

 

posted @ 2019-10-23 11:50  Scorpicat  阅读(143)  评论(0编辑  收藏  举报