您的位置:首页 > 编程语言 > Python开发

Python(异常处理与程序调试)

2017-11-29 11:27 555 查看
Python标准库的每个模块都使用了异常,异常在Python中除了可以捕获错误,还可以调试程序。

一、Python中的异常

异常是指程序中的例外、违例情况。异常机制是指当程序出现错误后,程序的处理方法。异常机制提供了程序正常退出的安全通道。当错误出现后,程序的流程发生改变,程序的控制权转移到异常处理器,当异常被引发时,如果没有代码处理该异常,异常将被Python接收处理。当异常发生时,Python解释器将输出一些相关的信息并终止程序的运行。

在Python3中,BaseException是所有异常类的基类,所有的内置异常都是它的派生类,Exception是除了SystemExit、GeneratorExit和KeyboardInterrupt之外的所有内置异常的基类,用户自定义的异常在应该继承它。

Eeception异常类包括:

(1)StopItertion,当迭代器中没有数据项时触发,由内置函数next()和迭代器的next()方法触发。

(2)ArithmeticError,算法异常的基类,包括溢出异常,零除异常和浮点数操作失败异常。

(3)AssertionError,assert语句失败时触发。

(4)EOFError,文件末尾,使用内置函数inpiut()时生成,表示到达文件末尾,但是如read()和readline()等大多数I/O操作将返回一个空字符串来表示EOF,而不是引发异常。

(5)LookUpError,当使用映射或者序列时,如果键值或者索引无法找到时触发,它是KeyError和IndexError的基类。

(6)ReferenceError,引用异常,当底层对象被销毁后访问弱引用时触发。

(7)Warning,警告,warnings模块,用来通知程序员不支持的功能。

Python内的异常使用继承结构创建,在这种设计方式非常灵活,可以在异常处理程序中捕获基类异常,也可以捕获各种子类异常,Python使用try…except语句捕获异常,异常类型定义在try子句后面。如果在except子句后将异常类型设置为Exception,异常处理程序将捕获除了程序中中断以外的所有异常,因为Exception类是其他异常类的基类。

*try…except的使用:

try…excepr语句用于处理问题语句,捕获可能出现的异常,try子句中放置可能出现异常的语句,except子句中的代码块处理异常,当异常出现时,Python会自动生成一个异常对象,该对象包括异常的具体信息,以及异常的种类和错误位置。

#FileNotFoundError
#try子句中写可能会出现异常的代码,在except子句后定义异常类型,用于Python解释器正确捕捉到发生的异常
#except子句中写异常发生时程序做出的处理动作
try:
open('try.txt','r')  #尝试读取一个不存在的文件,由于文件不存在,程序立即跳转至except语句处
print('读文件')
except FileNotFoundError:  #捕获该异常类型的异常并做出处理
print('文件不存在')
except:   #当捕获其他异常时做出的处理
print('程序异常')

#ZeroDivisionError
print()
try:

result = 10 / 0

except ZeroDivisionError:
print('除法中除数不能为0!')
else:
print('result:',result)
result_1 = 10 / 2
print('result_1:',result_1)

#try...except嵌套
print()
try:
s = 'hello'
try:
print(s[0]+s[1])
print(s[0]-s[1])
except TypeError:
print('字符串不支持减法操作')
except:
print('其他异常')


try…except嵌套语句通常用于释放已经创建的系统资源

*try…finally的使用

try…except语句后还可以添加一个finally子句,无论异常是否发生,finally子句都会被执行。所有的子句通常用于关闭异常而不能释放的系统资源。

#try...finally

try:
f = open('try.txt')
try:
print(f.read())
except:
print('读文件错误')
finally:   #由于变量f定义在外层的try子句中,因此内层的finally子句可以使用变量f,无论文件读取的异常是否发生,f.close()语句都会被执行
print('关闭文件')
f.close()
except FileNotFoundError:
print('文件不存在')


注意:如果要在某个代码段中使用同一级其他代码块中定义的变量,可以考虑嵌套的方式或全局变量来实现。

*使用raise抛出异常

try:

s = None
if s is None:
print('s是空对象')
raise NameError  #如果变量s的值为空,则抛出异常NameError
print(len(s))  #由于引发了异常,所以该代码及后面的代码将不会被执行

# except TypeError:
#     print('空对象没有长度')
except NameError:
print('空对象没有长度')


Raise语句通常用于抛出自定义异常,因为自定义异常并不在Python的控制范围之内,不会被Python自动抛出,应使用raise语句手工抛出。

*自定义异常

Python允许程序员自定义异常类型,用于描述Python异常体系中没有涉及到的异常情况,自定义异常必须继承Exception类,自定义异常按照命名规则以 Error结尾,显示地说明该类是异常类,自定义异常使用raise语句引发,而且只能通过手工方式触发。

from __future__ import division

class DivisionException(Exception):
def __init__(self,x,y):
Exception.__init__(self,x,y)
self.x = x
self.y = y
if __name__ == "__main__":
try:
x = 3
y = 2
if (x % y > 0):
print(x/y)
# raise DivisionException(x,y)  #手工抛出自定义异常,
except DivisionException:
print('x/y = %.2f'%(x/y))


*assert语句的使用

assert语句用于检测某个条件表达式是否为真,assert语句又称为断言语句,即assert认为检测的表达式永远为真,if语句中的条件判断都可以用assert语句检测,如果断言失败,则会引发AssertionError异常。

t = ('hello',)
assert len(t)>=1

t = ('hello')
assert len(t)==1


运行结果:

D:\Anaconda3\python.exe E:/demo_py/python/char_9/assert.py
Traceback (most recent call last):
File "E:/demo_py/python/char_9/assert.py", line 6, in <module>
assert len(t)==1
AssertionError

进程已结束,退出代码1


assert语句还可以传递提示信息给Assertion异常。

month = 13
assert 1<=month<=12,'month errors'


运行结果:

D:\Anaconda3\python.exe E:/demo_py/python/char_9/assert.py
Traceback (most recent call last):
File "E:/demo_py/python/char_9/assert.py", line 9, in <module>
assert 1<=month<=12,'month errors'
AssertionError: month errors

进程已结束,退出代码1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 异常处理