Python中的异常处理

异常处理在任何一门编程语言里都是值得关注的一个话题,良好的异常处理可以让你的程序更加健壮,清晰的错误信息更能帮助你快速修复问题。在Python开发中,和部分高级语言一样,使用了try/except/finally语句块来处理异常,如果你有其他编程语言的经验,实践起来并不难。

异常处理语句 try…excpet…finally

实例代码

defdiv(a, b):

try:

print(a / b)

exceptZeroDivisionError:

print("Error: b should not be 0 !!")

exceptExceptionas e:

print("Unexpected Error: {}".format(e))

else:

print(’Run into else only when everything goes well’)

finally:

print(’Always run into finally block.’)

# tests

div(2, 0)

div(2, ’bad type’)

div(1, 2)

# Mutiple exception in one linetry:

print(a / b)

except (ZeroDivisionError, TypeError) as e:

print(e)

# Except block is optional when there is finallytry:

open(database)finally:

close(database)

# catch all errors and log ittry:

do_work()

except:

# get detail from logging module

logging.exception(’Exception caught!’)

# get detail from sys.exc_info() method

error_type, error_value, trace_back = sys.exc_info()

print(error_value)

raise

总结如下

1. except 语句不是必须的, finally 语句也不是必须的,但是二者必须要有一个,否则就没有 try 的意义了。

2. except 语句可以有多个,Python会按 except 语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的 except 语句。

3. except 语句可以以元组形式同时指定多个异常,参见实例代码。

4. except 语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。

5. 如果要捕获异常后要重复抛出,请使用 raise ,后面不要带任何参数或信息。

6. 不建议捕获并抛出同一个异常,请考虑重构你的代码。

7. 不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。

8. 尽量使用内置的异常处理语句来 替换try/except语句,比如 with 语句, getattr() 方法。

抛出异常 raise

如果你需要自主抛出异常一个异常,可以使用 raise 关键字,等同于C#和Java中的 throw 语句,其语法规则如下。

raiseNameError("bad name!")

raise 关键字后面需要指定你抛出的异常类型,一般来说抛出的异常越详细越好,Python在 exceptions 模块内建了很多的异常类型,通过使用 dir() 函数来查看exceptions 中的异常类型,如下:

importexceptions

# [’ArithmeticError’, ’AssertionError’.....]

printdir(exceptions)

自定义异常类型

Python中也可以自定义自己的特殊类型的异常,只需要要从 Exception 类继承(直接或间接)即可:

class SomeCustomException(Exception):

pass

一般你在自定义异常类型时,需要考虑的问题应该是这个异常所应用的场景。如果内置异常已经包括了你需要的异常,建议考虑使用内置 的异常类型。比如你希望在函数参数错误时抛出一个异常,你可能并不需要定义一个InvalidArgumentError ,使用内置的 ValueError 即可。

经验案例

传递异常 re-raise Exception

捕捉到了异常,但是又想重新引发它(传递异常),使用不带参数的 raise 语句即可:

deff1():

print(1/0)

deff2():

try:

f1()

exceptExceptionas e:

raise # don’t raise e !!!

f2()

在Python2中,为了保持异常的完整信息,那么你捕获后再次抛出时千万不能在 raise 后面加上异常对象,否则你的trace 信息就会从此处截断 。以上是最简单的重新抛出异常的做法。

还有一些技巧可以考虑,比如抛出异常前对异常的信息进行更新。

deff2():

try:

f1()

exceptExceptionas e:

e.args += (’more info’,)

raise

Python3对重复传递异常有所改进,你可以自己尝试一下,不过建议还是同上。

Exception 和 BaseException

当我们要捕获一个通用异常时,应该用 Exception 还是 BaseException ?这两个异常到底有啥区别呢? 请看它们之间的继承关系。

BaseException

+-- SystemExit

+-- KeyboardInterrupt

+-- GeneratorExit

+-- Exception

+-- StopIteration...

+-- StandardError...

+-- Warning...

从 Exception 的层级结构来看, BaseException 是最基础的异常类, Exception继承了它。 BaseException 除了包含所有的 Exception 外还包含了 SystemExit ,KeyboardInterrupt 和 GeneratorExit 三个异常。

有此看来你的程序在捕获所有异常时更应该使用 Exception 而不是 BaseException,因为另外三个异常属于更高级别的异常,合理的做法应该是交给Python的解释器处理。

except Exception as e和 except Exception, e

代码示例如下:

try:

do_something()

exceptNameErroras e: # should

pass

exceptKeyError, e: # should not

pass

在Python2的时代,你可以使用以上两种写法中的任意一种。在Python3中你只能使用第一种写法,第二种写法被废弃掉了。第一个种写法可读性更好,而且为了程序的兼容性和后期移植的成本,请你也抛弃第二种写法。

raise “Exception string”

把字符串当成异常抛出看上去是一个非常简洁的办法,但其实是一个非常不好的习惯。

if is_work_done():

passelse:

raise "Work is not done!" # not cool

上面的语句如果抛出异常,那么会是这样的:

Traceback (mostrecentcalllast):

File "/demo/exception_hanlding.py", line 48, in

raise "Work is not done!"

TypeError: exceptionsmustbeold-styleclassesor derivedfromBaseException, not str

这在Python2.4以前是可以接受的做法,但是没有指定异常类型有可能会让下游没办法正确捕获并处理这个异常,从而导致你的程序挂掉。简单说,这种写法是是封建时代的陋习,应该扔了。

使用内置的语法范式代替try/except

Python 本身提供了很多的语法范式简化了异常的处理,比如 for 语句就处理的 StopIteration 异常,让你很流畅地写出一个循环。

with 语句在打开文件后会自动调用 finally 中的关闭文件操作。我们在写Python代码时应该尽量避免在遇到这种情况时还使用try/except/finally的思维来处理。

# should nottry:

f = open(a_file)

do_something(f)finally:

f.close()

# should

withopen(a_file) as f:

do_something(f)

再比如,当我们需要访问一个不确定的属性时,有可能你会写出这样的代码:

try:

test = Test()

name = test.name # not sure if we can get its name

exceptAttributeError:

name = ’default’

其实你可以使用更简单的 getattr() 来达到你的目的。

name = getattr(test, ’name’, ’default’)

最佳实践

最佳实践不限于编程语言,只是一些规则和填坑后的收获。

1. 只处理你知道的异常,避免捕获所有 异常然后吞掉它们。

2. 抛出的异常应该说明原因,有时候你知道异常类型也猜不出所以然的。

3. 避免在catch语句块中干一些没意义的事情。

4. 不要使用异常来控制流程,那样你的程序会无比难懂和难维护。

5. 如果有需要,切记使用finally来释放资源。

6. 如果有需要,请不要忘记在处理异常后做清理工作或者回滚操作。

来源:伯乐在线

时间: 2024-10-09 17:22:48

Python中的异常处理的相关文章

Python基础---python中的异常处理

Python中的异常处理 一.什么是异常处理 python解释器检测到错误,触发异常(也允许程序员自己触发异常) 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关) 如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理. 二.为什么要进行异常处理 python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件. 所以你必须

第五章 python中的异常处理

每种编程语言都会有自己的异常处理机制,虽然各有特色,但基本上都差不多,那么python中强大异常处理机制是什么样的呢? 一.异常: python用异常对象来表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕获,程序会用回溯终止执行: 1 >>> 1/0 2 Traceback (most recent call last): 3 File "<stdin>", line 1, in <module> 4 ZeroDivisionE

Python 中的异常处理

Python 中内置了多种异常处理方式. 1 try····except··· a = 10 b = 0 try: i = a/b except Exception, e: print e >>> integer division or modulo by zero # 先执行try语句块的内容,若能正常执行,则略过except内容:若try语句块不能正常运行,则紧跟着执行except语句块内容: a = 10 b = 0 try: i = a/b except Exception, e

python中的异常处理:厌而不舍

  什么是异常? ------异常:不正常的情况 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常. 异常是Python对象,表示一个错误. 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行. 异常出现的原因: 不正常的情况,在程序中,会有两种体现: 代码错误或语法错误:程序都运行不起来! 程序运行过程中,在某些特定条件下,不合适的数据引起程序出现错误导致程序崩溃 例如:要求用户输入一个数字,但是

python中的异常处理相关语句和迭代器

异常(基础) exception什么是错误    错误是指由于逻辑或语法等导致一个程序无法正常执行的问题什么是异常    异常是程序出错时标识的一种状态    当异常发生时,程序不会再向下执行,而转去调用此函数的地方待处理此错误并恢复为正常状态  作用:    用作信号,通知上层调用者有错误产生需要处理try语句:    两种语法:    try- except    try --finally 语句try-except语句    语法:    try:        可能触发异常的语句   

Python中的异常处理的习题

1 定义一个函数func(filepath) filepath:为文件名,用with实现打开文件,并且输出文件内容. 1 # -*- coding: UTF-8 -*- 2 3 4 def func(filepath): 5 with open(filepath) as aj: 6 return aj.read() 7 8 print func(r'E:/system.txt') 2 定义一个函数func(listinfo) listinfo:为列表,listinfo = [133, 88, 2

Python学习-16.Python中的错误处理

虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: 1 file = open('','r') 上面一句由于路径是空路径,因此文件肯定是不存在的,执行这一句会引发 FileNotFoundError 这个错误. 既然是错误的,程序也停止了,这是我们不希望的,因此得想办法处理一下. 在 Python 中,异常处理使用 try.except.finally 这三个关键字. 修改代码如下: 1 path

python中不同的异常类型,如何进行异常处理?

一.错误与异常 程序中难免会出现错误,而错误分为两种 1.语法错误:(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误:(逻辑错误),比如用户输入的不合适等一系列错误 那什么是异常呢? 异常就是程序运行时发生错误的信号,在python中,错误触发的异常如下.异常发生之后,异常之后的代码就不执行了 异常种类:在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识, 不同的类对象标识不同的异常,一个异常标识一种错误 常见的异

python 中异常处理

Python中的异常由 try-except [exceptionname] 块处理,例如: def some_function(): try: # Division by zero raises an exception 10 / 0 except ZeroDivisionError: print "Oops, invalid." else: # Exception didn't occur, we're good. pass finally: # This is executed