python中try/except/else/finally语句的完整格式如下所示:
try:
Normal execution block
except A:
Exception A handle
except B:
Exception B handle
except:
Other exception handle
else:
if no exception,get here
finally:
print("finally")
正常执行的程序在try下面的Normal execution block执行块中执行,在执行过程中如果发生了异常,则中断当前在Normal execution block中的执行,跳转到对应的异常处理块中开始执行;
python从第一个except X处开始查找,如果找到了对应的exception类型则进入其提供的exception handle中进行处理,如果没有找到则直接进入except块处进行处理。except块是可选项,如果没有提供,该exception将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息;
如果在Normal execution block执行块中执行过程中没有发生任何异常,则在执行完Normal execution block后会进入else执行块中(如果存在的话)执行。
无论是否发生了异常,只要提供了finally语句,以上try/except/else/finally代码块执行的最后一步总是执行finally所对应的代码块。
需要注意的是:
1.在上面所示的完整语句中try/except/else/finally所出现的顺序必须是try-->except X-->except-->else-->finally,即所有的except必须在else和finally之前,else(如果有的话)必须在finally之前,而except X必须在except之前。否则会出现语法错误。
2.对于上面所展示的try/except完整格式而言,else和finally都是可选的,而不是必须的,但是如果存在的话else必须在finally之前,finally(如果存在的话)必须在整个语句的最后位置。
3.在上面的完整语句中,else语句的存在必须以except X或者except语句为前提,如果在没有except语句的try block中使用else语句会引发语法错误。也就是说else不能与try/finally配合使用。
def div_apple(n):
print('%d个苹果您想分给几个人?' % n)
s = input('请输入人数:')
cnt = int(s) # <<-- 可能触发异常ValueError错误进入异常
result = n / cnt # <<-- 可能触发ZeroDivsionError错误进入异常
print('每个人分了', result, '个苹果')
try: # 正常执行
div_apple(10)
print('分苹果完成')
#-------------模块一:except 错误类型,捕获异常类型---------------------------
# except ValueError: # 只有在有异常时才会执行
# print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except ZeroDivisionError:
# print('输入人数为0,分苹果失败')
#-------------------------------------------------------------------------
#---模块二:except(错误类型1,错误类型2):满足这两个错误类型都执行这个函数------
# except (ValueError, ZeroDivisionError):
# print('苹果不分了')
#--------------------------------------------------------------------------
#--模块三:except:除了捕获的之外,不管什么异常都执行此函数----------------------
# except ValueError: # 只有在有异常时才会执行
# print('在try的内部语句中发生了值错误,已处理并转为正常状态')
# except:
# print('收到除ValueError之外的错误通知')
#---------------------------------------------------------------------------
#--模块四:as 变量: 将捕获的错误信息用变量绑定----------------------------------
# as 的用法
# except ValueError as err:
# print('错误的值是:', err) # invalid literal for int() with base 10: 'aaa'
# 10个苹果您想分给几个人?
# 请输入人数: aaa
# 错误的值是: invalid literal for int() with base 10: 'aaa'
# 程序正常退出
#---------------------------------------------------------------------------
#--模块五:else的用法,只有在try是没有异常的时候才会执行--------------------------
# except ValueError:
# print('苹果不分了')
# else: # 只有在try没有发生错误时才会执行
# print('在当前try语句内部,没有发生任何异常,程序正常执行')
#----------------------------------------------------------------------------
#--模块六:finally的用法,不管try有没有错误,其下的语句块都会执行------------------
# finally字句的用法
except ValueError:
print('苹果不分了')
except: # 除ValueError异常外的异常
print('错误值是:0' )
else: # 如果没有异常才执行
print('else子句被执行了')
finally: # 不管有没有异常都会执行的语句
print('finally子句被执行了')
print('程序正常退出')
注:try-except语句也可以放在函数的内部使用
# 方法一
def get_score():
try:
score = int(input('输入成绩: '))
except ValueError:
return 0
if score in range(101):
return score
else:
return 0
score = get_score()
print('学生的成绩是:', score)
# 方法二
def get_score():
score = int(input('输入成绩: '))
if score in range(101):
return score
else:
return 0
try:
score = get_score()
except ValueError:
score = 0
print('学生的成绩是:', score)
原文:
https://blog.csdn.net/geek_xiong/article/details/81915786
http://www.cnblogs.com/windlazio/archive/2013/01/24/2874417.html
https://blog.csdn.net/f156207495/article/details/78387617/