学习笔记

Python捕获异常

#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语句可以手动引发异常

''''''

发表回复