【Pyhton】异常处理

异常是什么?

    软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception ,意思是例外。遇到这些例外情况, 或者叫异常,我们怎么让写的程序做出合理的理,安全的退出, 而不至于程序崩溃呢?

工作中,程序遇到的情况不可能完美。比如:程序要打开某个 文件,这个文件可能不存在或者文件格式不对;程序在运行 着,但是内存或硬盘可能满了等等。

伪代码说明异常机制

如果我们要拷贝一个文件,在没有异常机制的情况下我们需要考虑各种异常情况伪代码如下:
// d:/a.txt复制到e:/a.txt(伪代码)
if ("d:/a.txt"这个文件存在){
    if(e盘的空间大于a.txt文件的长度){
        if(文件复制一半IO流断掉){
             停止copy,输出:io流有问题!     
  }else{
        copyFile("d:/a.txt","e:/a.txt");        
  }
  }else{
    System.out.println("e盘空间不够存放a.txt文件!");
}
}else{
     System.out.println("a.txt不存在!");
}
这种方式,有两个坏处:
  •  逻辑代码和错误处理代码放一起!
  •  程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!

如上情况,如果是用Python的异常机制来处理,对比如下:

异常机制本质

当程序出现异常,程序安全的退出、处理完后继续执行的机制
python 中,引进了很多用来描述和处理异常的类,称为异常类。异 常类定义中包含了该类异常的信息和对异常进行处理的方法。下面 较为完整的展示了python中内建异常类的继承层次:
 如测试0是否被整除:
#测试简单的0不能做除数异常
a = 3/0

 报错,异常了,显示0不能被整除

Traceback (most recent call last):
  File "...mypro_exception/my01.py", line 1,
in <module>
    a = 3/0
ZeroDivisionError: division by zero
Process finished with exit code 1

 使用try...except来定位异常:

try:
    a = 3/0
except ZeroDivisionError as e:
    print(e)   
    # division by zero  

异常解决的关键:定位

当发生异常时,解释器会报相关的错误信息,并会在控制台打印出 相关错误信息。我们只需按照从上到下的顺序即可追溯 (Trackback)错误发生的过程,最终定位引起错误的那一行代码。
【示例】追溯异常发生的过程
def a():
    print("run in a() start! ")


num = 1 / 0
print("run in a() end! ")


def b():
    print("run in b() start!")
a()
print("run in b() end! ")


def c(): print("run in c() start!")
b()
print("run in c() end! ")
print("step1")
c()
print("step2")

try...except结构

try...except 是最常见的异常处理结构。结构如下:
try :
被监控的可能引发异常的语句块
except   BaseException [ as   e ]:
异常处理语句块
try 块包含着可能引发异常的代码, except 块则用来捕捉和处理发生的异常。
执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;
执行的时候,如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。
【示例】遇到异常的执行顺序
#测试简单的0不能做除数异常
try:
    print("step1")
    a = 3/0
    print("step2")
except BaseException as e:
    print("step3")
    print(e)
print("step4")

除数为 0 ,遇到异常输出结果:
step1
step3
division by zero  
step4

try...except...else结构

try...except...else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行 else 块。
如果 try 块中抛出异常,则执行 except 块,不执行 else 块。
try...except...finally 结构
try...except...finally 结构中, finally 块无论是否发生异常都会被执行;
通常用来释放 try 块中申请的资源。

常见异常汇总

自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一 般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error Exception 为后缀。 自定义异常由 raise 语句主动抛出。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值