python异常处理

python异常处理

学习完本篇,你将会独立完成

  • 如何编写一个程序防止异常崩溃退出
  • 各种异常如何捕获
  • 为后面接口自动化以及web自动化做准备

什么是异常

  • 在程序运行过程中可能发生的不正常事件。
  • 会中断正在运行中的程序。
  • 异常是程序执行期间发生的各种意外或错误。比如说:
    ① 用户输入出错
    ② 所需文件找不到
    ③ 运行时磁盘空间不够
    ④ 内存不够
    ⑤ 算术运算错 (数的溢出,被零除…)
    ⑥ 数组下标越界
     以及其它情况

Python中常见的异常类型

  • NameError:尝试访问一个未申明的变量
>>>  v
NameError: name 'v' is not defined
  • ZeroDivisionError:除数为0
>>> v = 1/0 ZeroDivisionError: int division or modulo by zero
  • SyntaxError:语法错误
>>> int int SyntaxError: invalid syntax (<pyshell#14>, line 1)
  • IndexError:索引超出范围
>>> List = [2] >>> List[3] Traceback (most recent call last):   File "<pyshell#18>", line 1, in <module>     List[3] IndexError: list index out of range
  • KeyError:字典关键字不存在
>>> Dic = {'1':'yes', '2':'no'} >>> Dic['3'] Traceback (most recent call last):   File "<pyshell#20>", line 1, in <module>     Dic['3'] KeyError: '3‘
  • IOError:输入输出错误
>>> f = open('abc') IOError: [Errno 2] No such file or directory: 'abc'
  • AttributeError:访问未知对象属性
>>> class Worker:  def Work():   print("I am working")
>>> w = Worker() >>> w.a Traceback (most recent call last):   File "<pyshell#51>", line 1, in <module>     w.a AttributeError: 'Worker' object has no attribute 'a‘
  • ValueError:数值错误
>>> int('d') Traceback (most recent call last):   File "<pyshell#54>", line 1, in <module>     int('d') ValueError: invalid literal for int() with base 10: 'd‘
  • TypeError:类型错误
>>> iStr = '22' >>> iVal = 22 >>> obj = iStr + iVal; Traceback (most recent call last):   File "<pyshell#68>", line 1, in <module>     obj = iStr + iVal; TypeError: Can't convert 'int' object to str implicitly
  • AssertionError:断言错误
>>> assert 1 != 1 Traceback (most recent call last):   File "<pyshell#70>", line 1, in <module>     assert 1 != 1 AssertionError

异常类的层次结构

  • 所有的python异常类都是系统类库中的BaseException类的子类,再由SystemExit、KeyboardInterrupt、GeneratorExit和Exception演变而来。大多数类有Exception演变而来,具体结构如下:
    图1

Python异常层次图

图2
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
GeneratorExit 生成器(generator)发生异常来通知退出
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
StandardError 所有的内建标准异常的基类
Warning 警告的基类

异常处理

  • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
    如果你不想在异常发生时结束你的程序,只需在try里捕获它。
  • 语法:
try
<语法> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
  • try工作原理
    当开始一个try语句,python就在当前程序的上下文中做标记,这样当异常出现时就可以回到这里,try字句先执行,接下来会发生什么依赖于于执行时是否出现异常。
    1.如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except字句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
    2.如果在try后的语句里发生了异常,却没有匹配的except字句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
    3.如果try字句执行时没有发生异常,python将执行else语句后面的语句(如果此时有else语句),然后控制通过整个try语句

try、except带参数示例

  • demo描述:打开一个文件,在该文件中的内容写入内容,且并未发生异常:
#!/usr/bin/python #
-*- coding: UTF-8 -*-
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功" fh.close()
#!/usr/bin/python #
-*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功" fh.close()

异常多种形态

Except不带参数语法:
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
Except带多种异常语法:
try:
正常的操作
.....................
except(Exception1 [,...ExceptionN]]]):
#发生以上多个异常中的一个,
#执行这块代码
......................
else:
如果没有异常执行这块代码
try-finally 语句
语法:
try:
<语句>
finally:
<语句> #退出try时总会执行 raise

try-finally实例

# -*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print "Error: 没有找到文件或读取文件失败"
执行顺序:先执行try语句,最后执行finally语句。
# -*- coding: UTF-8 -*-
try:
fh = open("testfile", “r")
try:
fh.write("这是一个测试文件,用于测试异常!!")
finally:
print "关闭文件" fh.close()
except IOError:
print "Error: 没有找到文件或读取文件失败"
思考:try嵌套,思考执行顺序

异常的参数

  • 异常参数:一个异常可以可以带上参数,可作为输出的信息参数
语法:try:
正常的操作
…………………
except ExceptionType, Argument:
你可以在这输出 Argument 的值...
  • 例子:
# -*- coding: UTF-8 -*-
# 定义函数
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print "参数没有包含数字\n", Argument
If __name__ == “__main__”
# 调用函数
temp_convert("xyz");
打印结果:
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

触发异常

  • raise语法: raise [Exception [, args [, traceback]]]
  • 说明:语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
    最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 定义函数
def mye( level ):
if level < 1:
raise Exception("Invalid level!", level)
# 触发异常后,后面的代码就不会再执行
try:
mye(0)
// 触发异常
except Exception:
print 1 else: print 2
posted @   IT策士  阅读(106)  评论(0编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示

目录导航