#try-except语句
'''异常捕获是通过try-except语句实现的,
在try代码块中包含 在执行过程中可能引发异常的语句,
如果没有发生异常,则跳到except代码块执行
这就是异常捕获'''
'''try语句的执行流程:
首先执行try中的代码块,如果执行过程中出现异常,系统会自动生成一个数据类型,并将该异常提交该Python解释器,此过程称为捕获异常。
当Python解释器收到异常对象时,会寻找能处理该异常对象的except块,如果找到合适的except块,则把该异常交给该except处理,这个过程被称为处理异常。
如果Python解释器找不到处理异常的except块,则程序运行终止。
事实上,不管程序代码是否处于try块中,甚至包括except有块中的代码,只要执行该代码时出现了异常,系统都会自动生成对应类型的异常。
但是如果此程序没有被try包裹,又或者没有为该异常配置相对应的用来处理它的except块,则Python解释器将无法处理,程序就会停止运行;反之,异常被try捕获并被except处理,则程序可以继续执行。
try:
<可能引发异常的语句>
except[异常类型]: #异常类型可用省略
<处理异常>
'''
print('--------没有指定捕获异常的类型-------------------')
i=input('请输入数字')
n=10
try:
result=n/int(i)
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except: #如果没有指定异常类型,则任何的异常类型都会按照下面的方法处理
print('发生异常')
print('程序继续运行')
'''如果不指定具体的异常类型数据,则except语句可以捕获在try过程中发生的所有异常。
如果指定具体的异常类型,则except语句只能捕获在try中发生的指定类型的异常。
在Python中推荐在except语句中指定具体的异常类型'''
print('------------指定捕获除零异常----------------------')
i=input('请输入数字')
n=100
try:
result=n/int(i)
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except ZeroDivisionError as e: #只能处理当被除数是0时发生的异常,其他异常还是会报错
print('不能除以0,异常{}'.format(e))
except ValueError as e:
print('数值转换异常')
print('----------------多个except代码块-----------------')
'''多条语句可能引发多种不同的异常,对每一种异常都会采用不同的处理方式。
针对这种情况,我们可以在try后面加上多个except代码块
try:
<可能引发异常的语句>
except 异常类型1:
<处理异常>
except 异常类型2:
<处理异常>
...
except:
<处理异常>
#省略异常类型的except代码块是默认的except代码块,它只能被放到最后,捕获上面没有被匹配的异常类。
'''
i=input('请输入数字')
n=1000
try:
result=n/int(i) #表达式可能发生除0异常,int(i)也可能发生整数转换异常
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except ZeroDivisionError as e: #捕获除零异常
print('不能除以0,异常:{}'.format(e))
except ValueError as e: #捕获整数转换异常
print('输入的是无效的数值,异常:{}'.format(e))
print('-----------多重异常捕获---------------')
'''如果多个except代码块的处理异常过程类似,则可以合并处理,这就是多重异常捕获'''
i=input('请输入数值')
n=1000
try:
result=n/int(i)
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except (ZeroDivisionError,ValueError) as e:
print('异常发生:{}'.format(e))
print('-------------try-except语句嵌套-----------------')
i=input('请输入数值')
n=100
try:
i2=int(i) #整数转换过程可能发生异常
try:
result=n/i2
print('{0}除以{1}等于{2}'.format(n,i2,result))
except ZeroDivisionError as e1:
print('不能除以0,异常:{}'.format(e1))
except ValueError as e2:
print('输入的是无效的数值,异常:{}'.format(e2))
print('---------------使用finally代码块释放资源---------------')
'''有时在try-except语句中会占用一些资源,例如打开的文件、网络连接、打开的数据库及数据结果集等都会占用计算机资源,需要程序员释放这些资源。
为了确保这些资源能被释放,可以在try-except代码块后面加上finally代码块
try:
<可能引发异常的语句>
except 异常类型1:
<处理异常>
except 异常类型2:
<处理异常>
...
except:
<处理异常>
finally:
<释放资源的代码>
'''
i=input('请输入数值')
n=1000
try:
result=n/int(i)
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except ZeroDivisionError as e:
print('不能除以0,异常:{}'.format(e))
except ValueError as e:
print('数值转换异常:{}'.format(e))
finally:
#释放资源代码
print('资源释放')
#捕获到数值转换异常或除零异常,或者代码正常运行,都会执行finally代码块
print('---------------自定义类异常-------------------------')
'''许多公司为了提高代码的可重用性,自己编写了一些Python类库,其中自己编写了一些异常类。
实现自定义异常类,需要继承Exception类或其子类,
前面的ZeroDivisionError和ValueError都属于Exception的子类'''
class zdy(Exception):
def __init__(self,message): #构造方法,其中的参数message是异常妙手信息
super().__init__(message) #调用父类构造方法,并把参数message传递给父类构造方法
i=input('请输入数值')
n=100
try:
result=n/int(i)
print(result)
print('{0}除以{1}等于{2}'.format(n,i,result))
except ZeroDivisionError as e:
#print('不能除以0,异常:()'.format(e)
raise zdy('不能除以0') #raise语句可以手动引发异常
except ValueError as e:
#print('数值转换异常:{}'.format(e))
raise zdy('输入的是无效的数值') #raise语句可以手动引发异常
''''''