python异常捕获抛出_python学习-异常处理之捕获异常与抛出异常(七)

  • Post author:
  • Post category:python


捕获异常

python完整的异常处理语法结构如下:

特别说明:

1.try块是必需的,except块和finally,当try块没有出现异常时,程序会执行else块

2.try块后只有一个except快块会被执行,不可能有多个except块被执行。

3.原则:先捕获小异常再捕获大异常

实例:

importsystry:

a= int(sys.argv[1])

b= int(sys.argv[2])

c= a /bprint(“您输入的两个数相除的结果是:”,c)exceptIndexError:print(“索引错误:运行程序时输入的参数个数不够”)exceptValueError:print(“数值错误:程序只能接受整数参数”)exceptArithmeticError:print(“算术错误”)exceptException:print(“未知异常”)#输出结果:

E:\myproj\crazy_python\07\7.2>python div_test.py 30

算术错误

单异常捕获

importsystry:

a= int(sys.argv[1])

b= int(sys.argv[2])

c= a /bprint(“您输入的两个数相除的结果是:”,c)except(IndexError, ValueError, ArithmeticError):print(“程序发生了数组越界、数字格式异常、算术异常之一”)except:print(“未知异常”)#输出结果

E:\myproj\crazy_python\07\7.2>python multi_exception_test.py 40

程序发生了数组越界、数字格式异常、算术异常之一

多异常捕获

deffoo():try:

fis= open(“a.txt”)exceptException as e:print(e)print(e.args)print(e.errno)print(e.strerror)

foo()#输出结果:

[Errno 2] No such file or directory: ‘a.txt'(2, ‘No such file or directory’)2No such fileor directory

访问异常信息

4. 1try或except中的return语句,不会影响finally块的执行;但是os._exit()语句会退出python解释器,导致finally块试去执行机会。

importosdeftest():

fis=Nonetry:

fis= open(“a.txt”)exceptOSError as e:print(e.strerror)returnos._exit(1)finally:if fis is notNone:try:

fis.close()exceptOSError as ioe:print(ioe.strerror)print(“执行finally里的资源回收!”)

test()#输出结果:

No such file ordirectory

执行finally里的资源回收!

finally_1

4.1不能在finally块使用return或raise。finally块中的return或raise语句,会导致try、except块中的return、raise语句失效

deftest():try:return True #由于finally中包含return,该return语句失效

finally:returnFalse

a=test()print(a)#输出结果

False

finally_2

抛出异常(使用raise引发异常)

不管是系统引发的异常,还是程序员使用raise手动引发的异常,python解释器对异常的处理没有任何差别,都可以使用try…except来捕获它

raise语句有如下三种常用用法:

defmain():try:

mtd(3)exceptException as e:print(“程序出现异常:”, e)

mtd(3)defmtd(a):if a >0:raise ValueError(“a的值大于0.不符合要求”)

main()#输出结果:

D:\soft\python36\python.exe D:/myproject/crazy_python/07/7.3/raise_test.py

Traceback (most recent call last):

程序出现异常: a的值大于0.不符合要求

File”D:/myproject/crazy_python/07/7.3/raise_test.py”, line 17, in main()

File”D:/myproject/crazy_python/07/7.3/raise_test.py”, line 9, inmain

mtd(3)

File”D:/myproject/crazy_python/07/7.3/raise_test.py”, line 14, inmtdraise ValueError(“a的值大于0.不符合要求”)

ValueError: a的值大于0.不符合要求

raise_1

except和raise同时使用

class AuctionException(Exception): pass

classAuctionTest:def __init__(self, init_price):

self.init_price=init_pricedefbid(self, bid_price):

d= 0.0

try:

d=float(bid_price)exceptException as e:#此处只是简单地打印异常信息

print(“转换出异常:”, e)#再次引发自定义异常#raise AuctionException(“竞拍价必须是数值,不能包含其他字符!”) # ①

raiseAuctionException(e)if self.init_price >d:raise AuctionException(“竞拍价比起拍价低,不允许竞拍!”)

initPrice=ddefmain():

at= AuctionTest(20.4)try:

at.bid(“df”)exceptAuctionException as ae:#再次捕获到bid()方法中的异常,并对该异常进行处理

print(‘main函数捕捉的异常:’, ae)

main()#输出结果:

转换出异常: could not convert string to float: ‘df’main函数捕捉的异常: couldnot convert string to float: ‘df’

except_raise



版权声明:本文为weixin_39819974原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。