Python 异常处理

01_异常的本质_调试核心理念

    1.异常导引

    2.异常机制本质

           a.异常是指程序运行过程中出现的非正常现象,例如用户输入错误,除数为0,需要处理的文件不存在,数组下标越界等

           b.异常处理:指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行

           c.Python中引进了很多用来描述和处理异常的类,称为异常类

           d.Python中一切都是对象,异常也采用对象的方式来处理。处理过程:

                     1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并                                            把异常对象提交给解释器

                    2.捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常

a=3/0
#以下为异常

C:\Users\小鹿\PycharmProjects\untitled1\venv\Scripts\python.exe C:/Users/小鹿/PycharmProjects/untitled1/Python5.py
Traceback(追溯的意思) (most recent call last)【最后一次调用】:
  File "C:/Users/小鹿/PycharmProjects/untitled1/Python5.py", line 1, in <module>
    a=3/0
ZeroDivisionError(零的除法异常): division by zero

 

02_try_except基本结构

      try:

           被监控的可能引发异常的语句块

     except BaseException[as e]:

           异常处理语句块

<注>1.try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常,执行的时候,如果try块中没有发生异常,则跳过except块继续执行后续代码;执行的时候,如果try块发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常 ;异常处理完后,继续执行后续代码

         2.BaseException是所有异常的根类

try:
    print("a")
    #a=1/0
    a=9/3#对比没有异常
    print("b")#因为上一条语句出现异常,所以本条语句不执行
except BaseException as f:#把异常对象赋值给f
    print("c")
    print(f)
    print(type(f))#查看f的类型
#处理完异常以后,程序继续执行
print("d")
#示例循环输入数字,如果不是数字则处理异常

while True:
    try:
        print("请输入一个数字:")
        x=int(input())
        if x==5:
            print("x=5")
            break
    except BaseException as f:
        print(f)
        print("处理异常")
print("程序结束!")

##################控制台:
请输入一个数字:
2
请输入一个数字:
热
invalid literal for int() with base 10: '热'
处理异常
请输入一个数字:
5
x=5
程序结束!

 

03_try_多个except结构

       捕获可能出现的多个异常,按照先子类后父类的顺序,并且针对性的写出异常处理代码,为避免遗漏可能出现的异常,可以在最后增加Baseexception 。结构如下:

        try:

                被监控的,可能引发异常的语句块

        except Exception1:

               处理Exception1的语句块

        except Exception1:

               处理Exception1的语句块

        ... 

       except Baseexception:

                处理可能遗漏的异常的语句块

#测试try,多个except
try:
    a=input("请输入一个被除数:")
    b=input("请输入一个除数:")
    c=float(a)/float(b)
    print(c)
except ZeroDivisionError:
    print("除数不能为0")
except ValueError:
    print("不能将字符串转化为数字")
except BaseException as f:
    print(f)
    print("其他异常!")

 

04_else结构

try...except...else结构增加了“else”块,如果try块中没有抛出异常,则执行else块。如果try块抛出异常,则执行except块,不执行else块

#测试try,多个except
try:
    a=input("请输入一个被除数:")
    b=input("请输入一个除数:")
    c=float(a)/float(b)
except BaseException as f:
    print(f)
    print("异常!")
else:
    print("没有异常!除的结果是:",c)
print("程序结束")

05_finally结构

try...except...finally结构中,finally块无论是否发生异常都会被执行,通常用来释放try块中申请的资源

#测试try...except...else...finally
try:
    a=input("请输入一个被除数:")
    b=input("请输入一个除数:")
    c=float(a)/float(b)
except BaseException as f:
    print(f)
    print("异常!")
else:
    print("没有异常!除的结果是:",c)
finally:
    print("finally")
print("程序结束")
#典型处理io流时,使用finally
try:
    f = open("19.txt", "r")
    a = f.readline()
    print(a)
except:
    print("文件未找到!")
finally:
    print("finally--关闭资源")
    try:
        f.close()
    except BaseException as e:
        print(e)
print("程序结束!")

 

06_常见异常汇总和说明

<注>return语句和异常处理问题:由于return有两种作用,结束方法运行、返回值,我们一般不把return放到异常处理结构中,而是放到方法最后

常见异常:

1.SyntaxError:语法错误

2.NameError:尝试访问一个没有申明的的变量

3.ZeroDivisionError:除数为0错误

4.ValueError:数值错误

5.TypeError:类型错误

6.AttributeError:访问对象的不存在属性

7.IndexError:索引越界异常

8.KeyError:字典的关键字不存在

 

07_with上下文管理

finally块由于是否发生异常都会执行操作,通常我们放释放资源的代码。其实我们可以通过with上下文管理更方便的实现释放资源的操作

with上下文管理的语法结构如下:

with context_expr[as var]:

        语句块

<注>with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用

 

#with不是用来取代try的,知识作为补充、方便我们文件管理、网络通信时的开发
with open("15.txt","r")as f:
    a=f.readline()
    print(a)
print("程序执行结束!")

 

08_trackback模块的使用_异常写入日志文件

#测试traceback模块的使用
import traceback
#try:
   # print("lal ")
    #num=1/0
#except:
   # traceback.print_exc()
############################将异常信息输出到文件
try:
    print("lal ")
    num=1/0
except:
    with open("15.txt","a")as f:
        traceback.print_exc(file=f)

 

09_自定义异常类_raise抛出异常

自定义异常类一般都是运行时异常,通常继承Exception或其子类即可,命名一般以Error,Exception为后缀

自定义异常由raise语句主动抛出

#自定义异常类
class AgeError(Exception):#继承
    def __init__(self,errorInfo):#重写构造器并添加局部变量,来描述错误信息
        Exception.__init__(self)#调用父类构造器
        self.errorInfo=errorInfo#添加属性
    def __str__(self):
        return str(self.errorInfo)+"年龄错误!"
###测试代码
if __name__=="__main__":#如果为True,则模块是作为独立文件运行,可以执行测试代码
    age=int(input("输入年龄:"))
    if age<1 or age>150:
        raise AgeError(age)#抛出异常
    else:
        print("正常年龄:",age)

 

10_pycharm的调试模式
1.进行调试的核心:设置断点。程序执行到断点时,暂时挂起,停止执行。在断点处可以详细观察程序运行情况,方便做出进一步的判断

2.进入调试视图,三种方法

 

#测试调试,断点
def aa():
    print("aaaa")
    print("bbbb")
    num1=2
    num2=num1*4
    num3=num2*5
    print("cccc")
    print("结束!")
if __name__=="__main__":
    print("main:bbbb")
    aa()
    print("main:cccc")
    print("main:结束!")

#对以上代码设置断点进行debug

3.测试run to cursor运行到光标处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值