0
点赞
收藏
分享

微信扫一扫

Python异常结构_机制_常见异常汇总


一 try_except基本结构

Python异常结构_机制_常见异常汇总_python

1.1 try…一个except结构

try...except是最常见的异常处理结构。结构如下:

try:
    被监控的可能引发异常的语句块
except BaseException [as e]:
    异常处理语句块

  1. try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常。
  2. 执行的时候,如果try块中没有引发异常,则跳过ecept块继续执行后续代码;
  3. 执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常;异常处理完后,继续执行后续代码。

【示例】遇到异常的执行顺序

#测试简单的0不能做除数异常
try:
  print("step1")
  a = 3/0
  print("step2")
except BaseException as e:
  print("step3")
  print(e)

print("step4")

Python异常结构_机制_常见异常汇总_python_02

Python异常结构_机制_常见异常汇总_python_03

除数为0,遇到异常输出结果:

step1
step3
division by zero
step4

【示例】循环输入数字,如果不是数字则处理异常;直到输入88,则结束循环。

while True:
  try:
    x = int(input("请输入一个数字:"))
    print("您入的数字是",x)
    if x==88:
      print("退出程序")
      break
  except:
    print("异常:输入的不是一个数字")

执行结果:

执行结果:
请输入一个数字:10
您入的数字是 10
请输入一个数字:abc
异常:输入的不是一个数字
请输入一个数字:88
您入的数字是 88
退出程序

1.2 try_多个except结构

Python异常结构_机制_常见异常汇总_perl_04

上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加BaseException。结构如下:

try:
    被监控的、可能引发异常的语句块
except Exception1:
    处理Exception1的语句块
except Exception2:
    处理Exception2的语句块

[...]
except BaseException:
    处理可能遗漏的异常的语句块

【示例】多个except结构

try:
  a = input("请输入被除数:")
  b = input("请输入除数:")
  c = float(a)/float(b)
  print(c)

except ZeroDivisionError:
  print("异常:除数不能为0")
except TypeError:
  print("异常:除数和被除数都应该为数值类型")
except BaseException as e:
  print(e)
  print(type(e))

执行结果:

请输入被除数:10
请输入除数:0
异常:除数不能为0

二 else结构

2.1 try…except…else结构

try...except...else结构增加了else块。如果try块中没有抛出异常,则执行else块。如果try块中抛出异常,则执行except块,不执行else块。

【示例】try...except...else结构执行测试

try:
  a = input("请输入被除数:")
  b = input("请输入除数:")
  c = float(a)/float(b)
except BaseException as e:
  print(e)
else:
  print("除的结果是:",c)

发生异常的执行情况(执行except块,没有执行else):

请输入被除数:5
请输入除数:0
float division by zero

没有发生异常的执行情况(执行完try块后,执行else):

请输入被除数:10
请输入除数:5
除的结果是: 2.0

三 finally结构和return语句位置

3.1 try…except…finally结构

Python异常结构_机制_常见异常汇总_异常处理_05

try...except...finally结构中,finally块无论是否发生异常都会被执行;通常用来释放try块中申请的资源。

【示例】try...except...finally结构简单测试

try:
  a = input("请输入一个被除数:")
  b = input("请输入一个除数:")
  c = float(a)/float(b)
except BaseException as e:
  print(e)
else:
  print(c)
finally:
  print("我是finally中的语句,无论发生异常与否,都执行!")

print("程序结束!")

执行结果如下:

请输入被除数:10
请输入除数:0
float division by zero
我是finally中的语句,无论是否发生异常都执行

【示例】读取文件,finally中保证关闭文件资源

try:
  f = open("d:/a.txt",'r')
  content = f.readline()
  print(content)
except BaseException as e:
  print(e)
finally:
  f.close()    #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行

print("step4")

发生异常的执行结果:

Traceback (most recent call last):
[Errno 2] No such file or directory: 'd:/a.txt'
 File "...mypro_exception/my01.py", line 8, in <module>
  f.close()    #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行
NameError: name 'f' is not defined

Process finished with exit code 1

3.2 return语句和异常处理问题

由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后。

【示例】return和异常结构的正确处理方式

def test01():
  print("step1")
  try:
    x = 3/0
    # return "a"
  except:
    print("step2")
    print("异常:0不能做除数")
    #return "b"
  finally:
    print("step4")
    #return "d"

  print("step5")
  return "e"     #一般不要将return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())

执行结果:

step1
step2
异常:0不能做除数
step4
step5
e

四 常见异常汇总说明

Python异常结构_机制_常见异常汇总_python_06

Python中的异常都派生自BaseException类,本节我们测试和列出常见的一些异常,方便初学者掌握。

4.1 常见异常的解决

  1. SyntaxError:语法错误

int a =3 
    ^
SyntaxError: invalid syntax

  1. NameError:尝试访问一个没有申明的变量

print(a)
NameError: name 'a' is not defined

  1. ZeroDivisionError:除数为0错误(零除错误)

a = 3/0
ZeroDivisionError: division by zero

  1. ValueError:数值错误

float("gaoqi")
ValueError: could not convert string to float: 'gaoqi'

  1. TypeError:类型错误

123+"abc"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

  1. AttributeError:访问对象的不存在的属性

a=100
a.sayhi()

AttributeError: 'int' object has no attribute 'sayhi'

  1. IndexError:索引越界异常

a = [4,5,6]
a[10]

IndexError: list index out of range

  1. KeyError:字典的关键字不存在

a = {'name':"gaoqi",'age':18}
a['salary']

KeyError: 'salary'

4.2 常见异常汇总

建议大家通读,把异常相关的单词背下来熟悉一下。这样可以克服“畏难情绪”。

异常名称

说明

ArithmeticError

所有数值计算错误的基类

AssertionError

断言语句失败

AttributeError

对象没有这个属性

BaseException

所有异常的基类

DeprecationWarning

关于被弃用的特征的警告

EnvironmentError

操作系统错误的基类

EOFError

没有内建输入,到达EOF 标记

Exception

常规错误的基类

FloatingPointError

浮点计算错误

FutureWarning

关于构造将来语义会有改变的警告

GeneratorExit

生成器(generator)发生异常来通知退出

ImportError

导入模块/对象失败

IndentationError

缩进错误

IndexError

序列中没有此索引(index)

IOError

输入/输出操作失败

KeyboardInterrupt

用户中断执行(通常是输入^C)

KeyError

映射中没有这个键

LookupError

无效数据查询的基类

MemoryError

内存溢出错误(对于Python 解释器不是致命的)

NameError

未声明/初始化对象 (没有属性)

NotImplementedError

尚未实现的方法

OSError

操作系统错误

OverflowError

数值运算超出最大限制

OverflowWarning

旧的关于自动提升为长整型(long)的警告

PendingDeprecationWarning

关于特性将会被废弃的警告

ReferenceError

弱引用(Weak reference)试图访问已经垃圾回收了的对象

RuntimeError

一般的运行时错误

RuntimeWarning

可疑的运行时行为(runtime behavior)的警告

StandardError

所有的内建标准异常的基类

StopIteration

迭代器没有更多的值

SyntaxError

Python 语法错误

SyntaxWarning

可疑的语法的警告

SystemError

一般的解释器系统错误

SystemExit

解释器请求退出

TabError

Tab 和空格混用

TypeError

对类型无效的操作

UnboundLocalError

访问未初始化的本地变量

UnicodeDecodeError

Unicode 解码时的错误

UnicodeEncodeError

Unicode 编码时错误

UnicodeError

Unicode 相关的错误

UnicodeTranslateError

Unicode 转换时错误

UserWarning

用户代码生成的警告

ValueError

传入无效的参数

Warning

警告的基类

WindowsError

系统调用失败

ZeroDivisionError

除(或取模)零 (所有数据类型)

deTranslateError

Unicode 转换时错误

UserWarning

用户代码生成的警告

ValueError

传入无效的参数

Warning

警告的基类

WindowsError

系统调用失败

ZeroDivisionError

除(或取模)零 (所有数据类型)


举报

相关推荐

0 条评论