Python学习笔记--异常处理try-except-else-finally语句,打印异常及自定义异常类

遇到异常,首先找度娘
Python中异常处理语句用try…excepy

print('step0')
try:
    print('step2')
    a=3/0               #发生异常,跳转到except下语句
    print('step2')      #上方异常,被跳过
except:                 #try里若无错误,则except不执行
    print('发生异常')

print('end')
运行结果
step0
step2
发生异常
end

示例 循环输入数字,如果不是数字则异常处理。直到输入88

while True:
    try:
        x=int(input("请输入一个数字"))
        print('输入的数字是',x)
        if x==88:
            print('退出程序')
            break
    except BaseException as e:
        print(e)
        print('输入的不是数字')
运行结果
请输入一个数字5
输入的数字是 5
请输入一个数字10
输入的数字是 10
请输入一个数字i
invalid literal for int() with base 10: 'i'
输入的不是数字
请输入一个数字88
输入的数字是 88
退出程序

一个try 可以对应多个except
但要注意,先放错误的子类,再放错误的父类
建议最后一个放 BaseException,以防止未知错误
测试try…多个except结构

try:
    x1=input("请输入一个被除数")
    x2=input("请输入一个除数")
    c=float(x1)/float(x2)
except ZeroDivisionError:
    print("错误,不能除以0")
except ValueError:              #允许这个异常与上一异常没有父子关系
    print("错误。不能将字符串转化成数字")
except NameError:
    print("错误,变量不存在")
except  BaseException:          #来防止其他异常
    print('其他异常')
运行结果
请输入一个被除数5
请输入一个除数0
错误,不能除以0

还可以使用try…except…else结构
如果try中没有抛出异常,则执行else,若出现异常执行except不执行else

try:
    a=input('请输入被除数')
    b=input('请输入除数')
    c=float(a)/float(b)
except BaseException:
    print("出现异常")
else:
    print('结果为:',c)

print('程序结束')
运行结果
请输入被除数5
请输入除数1
结果为: 5.0
程序结束

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

try:
    a1=input('请输入被除数')
    b1=input('请输入除数')
    c1=float(a1)/float(b1)
except BaseException:
    print("出现异常")
else:
    print('结果为:',c1)
finally:
    print('finally语句,我都被执行')

print('程序结束')
运行结果
请输入被除数5
请输入除数1
结果为: 5.0
finally语句,我都被执行
程序结束

测试释放try块中申请的资源

try:
    f=open("d:/a.txt","r")      #读取文件
    content =f.read()
    print(content)
except:
    print("文件未找到")
finally:
    try:
        f.close()
    except BaseException as e:
        print(e)
print("程序结束")
运行结果
文件未找到(这里我随便输入的文件名,因此不会找的文件)
name 'f' is not defined
程序结束

有时我们需要将异常信息输出到指定文件中这时使用traceback包内的print_exc用来打印异常信息
好处:让程序一直跑,人离开后能记录异常

try:
    print('step1')
    num=1/0
except:
    traceback.print_exc()
    #将异常信息输出到指定文件中
    with open('d:/a.txt',"a") as f:
       traceback.print_exc(file=f)

我们还可以自定义异常类
一般继承Exception或其子类即可,命名一般以Error、Exception为后缀

class AgeError(Exception):  #继承Exception类
    def __init__(self,errorInfo):
        Exception.__init__(self)
        self.errorInfo=errorInfo

    def __str__(self):
        return str(self.errorInfo)+',年龄错误,应在1-150之间'

###############测试代码##################

if __name__=='__main__':    #如果为true,则模块是作为独立文件运行,可以执行代码
    age = int(input('请输入一个年龄:'))
    if age<1 or age>150:
        raise AgeError(age)
    else:
        print('年龄正常',age)
运行结果
请输入一个年龄:200
Traceback (most recent call last):
  File "E:/pycharm/Python 练习/异常处理4.py", line 17, in <module>
    raise AgeError(age)			#这里是我们自定义的错误类
__main__.AgeError: 200,年龄错误,应在1-150之间

你可能感兴趣的:(Python学习笔记--异常处理try-except-else-finally语句,打印异常及自定义异常类)