PythonStudy——异常处理

什么是异常

异常指不同于常规的情况

在python中是表示程序遇到了错误

一旦出现了错误,解释器会给出错误详细信息,并终止程序的执行! 这个过程我们称为抛出异常

常见异常

  • AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x

  • IOError 输入/输出异常;无法打开文件或无法读写

  • ImportError 无法引入模块或包;基本上是路径问题或名称错误

  • SyntaxError Python语法错误异常,代码不能编译

  • IndentationError 缩进异常;代码没有正确缩进

  • IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

  • KeyError 试图访问字典里不存在的键

  • KeyboardInterrupt Ctrl+C被按下

  • NameError 使用一个还未被赋予对象的变量

  • TypeError 传入对象类型与要求的不符合

  • UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它

  • ValueError 传入一个调用者不期望的值,即使值的类型是正确的

异常的分类

按照异常发生的时间可以将异常分为两类

1.语法检测异常

运行代码前都会先检测语法,这个期间产生的异常就是语法检查异常,如果发生了语法检测异常则不会运行代码,通过是因为你代码不符合python语法规范,或是缩进未对齐

#语法异常
a =

2.运行时异常

当代码通过了语法检测后就开始解释执行,这执行期间出现的异常称为运行时异常

作为合格的python程序员是绝对不应该出现语法检测异常的

异常处理

程序出现异常对于程序的使用者而言是体验是非常差的,

例如iphone手机APP的闪退其实都是因为异常导致的,并不是手机的问题,给用户的感觉就是这个软件非常垃圾或手机非常垃圾,所以我们需要尽量避免程序出现错误

但是终究不可能完全避免出现错误,所以python为我们提供了处理异常机制,来帮助我们提升程序的健壮性

处理异常的目的就是避免程序因为错误而强行终止

语法1 多分支

try:

except type1:

except type 2:

语法2 多异常合并处理

try:

except (type1,type2,…….):

语法3 万能异常

try:

except Exception as 别名:

语法4 多分支+万能异常

try:

except type1:

except type 2:

except Exception as 别名:

语法5 try + else

try:

except type:

else:

没有出现异常时

语法6 try+finally

try:

except type:

finally:

最终 用于清理操作

抛出异常

当我们的程序在执行过程中由于接收到的参数不正确或者其他情况导致,后续代码无法执行时,可以主动抛出异常

使用raise关键字,后面跟任意Exception的子类或子类实例

# 直接抛出异常 
raise TypeError
# 直接抛出异常 并附加错误信息
raise TypeError("类型错误")

异常的组成

a = int("a")

""" 异常信息
Traceback (most recent call last): (追踪信息)
File "/Users/jerry/PycharmProjects/work/test.py", line 158, in <module>
  a = int("a")
ValueError(异常类型): invalid literal for int() with base 10: 'a'(异常信息)
"""

断言

断言是就是断定的意思,当一些代码的执行必须满足某个条件时,就需要先断定条件在继续执行,当然你可以使用if判断来处理

a = input("请输入一个数字:")

if a.isdigit():
   print("后续代码.......")
   print("后续代码.......")
   print("后续代码.......")
   print("后续代码.......")
   print("后续代码.......")
   print("后续代码.......")
# 上述方式如果后续代码太多则结构混乱 可以做一下修改

if not a.isdigit():
   raise TypeError("必须输入一个整数!")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")

以上代码还可以通过断言来进一步简化

assert a.isdigit()
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")
print("后续代码.......")

assert 后面跟条件即可 如果条件成立则正常执行,否则抛出AssertionError

断言可以简化代码 但是无法知道异常的详细信息

自定义异常类

通常异常的类型就应该能够表达异常大致原因,但是系统内置的异常类有限,当这些内置异常类无法表达遇到的异常时,就可以自定义异常类,通过继承Exception即可

#定义
class MyException(Exception):
   pass
#使用
raise MyException("这是一个自定义异常类型!")

"""
Traceback (most recent call last):
File "/Users/jerry/PycharmProjects/work/test.py", line 167, in <module>
  raise MyException("这是一个自定义异常类型!")
__main__.MyException: 这是一个自定义异常类型!
"""

异常的正确使用方式

1.在明确知道错误原因时,尽可能不使用异常处理,直接使用判断

2.避免使用万能异常,会使得你的程序即不出错,也不不正常执行,如果非要用,一定记得打印异常信息

3.常用的语法是第一种

猜你喜欢

转载自www.cnblogs.com/tingguoguoyo/p/10920161.html
今日推荐