Python 异常处理

Python有两种错误,一种是语法错误,一种是异常


语法错误也称为解析错误,是在语句或表达式上的语法错误

异常是在执行期间检测的错误,可以被捕捉并在程序中处理

>>> while True:
...     try:
...         x = int(input("Please enter a number: "))
...         break
...     except ValueError:
...         print("Oops!  That was no valid number.  Try again...")

   

引发异常

raise语句可以强行引发一个指定的异常

>>> raise NameError('xixi')

raise Exception([value])

raise的引发的异常必须为一个异常实例或异常类,value是一个说明异常细节的可选值

>>> raise Exception('xix','haha')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Exception: ('xix', 'haha')

如果需要引发异常,但不打算处理它,raise语句后不带任何参数,则会再次引发上一个异常

>>> try:
...     raise ValueError
... except ValueError:
...     print("将会再次引发异常")
...     raise
...
将会再次引发异常
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError


try...except异常处理语句

    try语句可能有多个except子句,以指定不同的异常处理程序,但是最多有一个处理程序会被执行

    except 语句可以将多个异常包装为元组来捕捉

    except语句可以使用as 限定符来为异常提供一个变量名称

    except语句如果不带任何异常类型,将捕捉所有异常

try:
    ... 
except (IOError, TypeError) as e:    #同时捕捉多个异常
    ...
except ValueError as e:        #为异常起一个名字
    ...
except NameError:
    pass
except :        #捕捉所有异常
    ...
    raise

    也可以使用pass语句来忽略异常


try...except语句工作方式

    首先,执行try子句中代码块

    如果为发生任何异常忽略,except子句

    如果try代码块发生异常,则跳过该子句其余部分

                如果由except捕捉,则执行该except子句的代码,然后继续执行try...except语句后的代码

                如果没有被捕捉,则传递给上层代码(try语句可能会被包括再上层try语句中),当传递到程序的最顶层依然为被捕捉,它就成为一个未处理异常,程序会终止运行并显示一条如上所示的信息。

    因此异常处理程序,不仅能处理再try子句中直接引发的异常,也能处理在try子句中调用的函数发生的异常


可选子句else,finally

try...except语句还有一个可选的else子句,该子句必须放在所有except子句后面

如果try代码块中代码不引发异常,则执行else子句的代码

try:
    ...
except:
    ...
else:
    print("no exception")


finally子句提供了无论是否出现异常都必须执行的代码

如果try子句中引发异常,并且没有except子句捕捉处理或异常发生在except或else子句中,那么在执行完finally子句后将重新引发这个异常

try语句由break,continue,return语句离开时同样会执行finally语句


可以使用finally子句来释放外部资源,例如文件和网络连接,无论资源是否被成功使用

f = open('a','r')
try:
    ...
finally:
    f.close()


异常类

Exception所有的非退出类异常的基类

GeneratorExit有生成器的.close()方法引发

KeyborderInterrupt由键盘中断引发,通常为Ctrl+C

SystemExit    程序退出/终止

可以通过使用Exception来捕捉除与程序退出相关异常之外的所有异常

try:
    ...
except Exception  as e:
    print('An error occurred : %s \n' % e)

        不过捕捉所有Exception异常可能会无法报告准确的信息,影响程序的调试

except语句可以不带任何异常,这样可以作为通配符来捕获所有异常

        最好在处理完异常后再重新提出异常,来允许调用者处理异常

try:
    ...
    raise KeybordInterrupt
except:
    print('捕捉到异常')
    raise



打印异常

except子句中使用as var为异常指定的名称变量,这个变量会绑定到一个异常实例,同时异常的参数将存放到实例args中

异常实例定义了__str__(),因此异常的参数可以直接打印

>>> try:
...     raise Exception('spam', 'eggs')
... except Exception as e:
...     print(type(e))    # the exception instance
...     print(e.args)     # arguments stored in .args
...     print(e)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = e.args     # unpack args

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值