博客信息

Python基础之异常

发布时间:『 2019-06-29 22:40』  博客类别:Python  阅读(670)

异常处理的引入

 

需求:

        从键盘输入被除数与除数,求商 并打印结果

 

1.输入的数据类型问题  ValueError:

2.ZeroDivisionError: division by zero

 

try-except


代码如下

a = int(input("请输入被除数"))
b = int(input("请输入除数"))
print("商为:%d" % a/b)

为了程序正常执行结束,改动如下

a = input("请输入被除数")
b = input("请输入除数")
#判断  a必须是全为数字组成才可以转换成int
if a.isdigit() and b.isdigit():
    a = int(a)
    b = int(b)
    #保证b不能为0才可以求商
    if b != 0:
        c = a / b
        print("商为:%d" % c)
    else:
        print("ZeroDivisionError: division by zero")
        print("除数不能为0")
else:
    print("输入类型有误")


注意:上面的代码臃肿了很多,下面我们利用异常的知识点对代码进行改进

 

a = input("请输入被除数")
b = input("请输入除数")
try:
    a = int(a)
    b = int(b)
    c = a / b
    print("商为:%d" % c)
except:
    print("输入类型有误或者除数为0")


异常处理的其他用法

异常处理:

    try:

        可能出现问题的代码

    except:

        捕获到异常后执行的代码

     try:

        可能出现问题的代码

     except Exception as e:

        print(e.args)

 

    try:

        可能出现问题的代码

    except 异常1:

        捕获到异常1后执行的代码

    except 异常2:

        捕获到异常2后执行的代码

    except 异常3:

        捕获到异常3后执行的代码

 

    多个异常之间,子类在前,父类在后

 

    try:

        可能出现问题的代码

    except(异常1,异常2...)

        捕获到异常元组中任何一个异常执行的代码

        注意:元组中的异常,没有顺序要求

 

 

a = input("请输入被除数")
b = input("请输入除数")
# 可以存在多个except分支,多个异常之间,要求,子类在前,父类在后
# try:
#     a = int(a)
#     b = int(b)
#     c = a / b
#     print("商为:%d" % c)
# except ValueError as e:
#     print(type(e))
#     print(e)
# except ZeroDivisionError:
#     print("数学异常")
# except Exception:
#     print("遇到异常")

# try:
#     print("转换a")
#     a = int(a)
#     print("转换b")
#     b = int(b)
#     print("计算")
#     c = a / b
#     print("商为:%d" % c)
# except ValueError as e:
#    print("输入类型有误")
# except ZeroDivisionError:
#     print("除数为0")

try:
    print("转换a")
    a = int(a)
    print("转换b")
    b = int(b)
    print("计算")
    c = a / b
    print("商为:%d" % c)
#     这种异常写法,与顺序无关,写起来方便,但是不推荐使用,原因在于不能针对每一种异常有针对性的应对措施
except (Exception,ValueError,ZeroDivisionError) as e:
    print(type(e))
    print("输入类型有误/或者除数为0")
    #args为BaseException中的一个成员变量,存储错误原因
    print(e.args)


try-except-else-finally

 

异常:try except  else  finally

 

else:

    没有异常的时候执行

 

finally

不管是否有异常,都会在程序结束前执行

 

异常中的else语法几乎不用

 

# class Data():
#     __single = None
#     __firstInit = False
#     def __new__(cls, *args, **kwargs):
#         # if cls.__single == None
#         if not cls.__single:
#             cls.__single = super().__new__(cls)
#             # return cls.__single
#         return cls.__single
#     def __init__(self,name):
#         if not Data.__firstInit:
#             self.name = name
#             Data.__firstInit = True
# data1 = Data('123')
# data2 = Data('456')
# print(id(data1))
# print(id(data2))
# print(data1.name)
# print(data2.name)

# try:
#     file = open('123.txt', 'r', encoding='utf-8')
#     content = file.read()
#     print(content)
#     file.close()
# except:
#     print("io异常")
# else:
#     print("没有异常")
# for i in range(5):
#     print(i)
# else:
#     print("循环结束")

try:
    file = open('123.txt', 'w', encoding='utf-8')
    file.write('HelloWorld1\n')
    file.write('HelloWorld2\n')
    file.write('HelloWorld3\n')
    # 抛出的是TypeError,却用ValueError去处理,结果就是处理不了
    # file.write([1,2,3,4])
    file.write([1,2,3,4].__str__())
except ValueError as e:
    print(e.args)
else:
    print("没有异常")
finally:
    file.close()
    #数据库关闭,socket关闭,io流关闭
    print("谢谢使用")

try:
    print("试一试")
finally:
    print("最后执行的代码")


异常传递过程

对比于Java,在Python中没有Error这一概念;

Python中,编译时的错误Error,也被Python解析器认为是异常Exception

异常的传递过程跟Java是一模一样的;

def test1():
    print("-" * 10 + "test1开始" + "-" * 10)
    try:
        print(aa)
    except:
        pass
    print("-" * 10 + "test1结束" + "-" * 10)
def test2():
    print("-" * 10 + "test2开始" + "-" * 10)
    test1()
    # try:
    #     test1()
    # except:
    #     pass
    print("-" * 10 + "test2结束" + "-" * 10)
def test3():
    print("-" * 10 + "test3开始" + "-" * 10)
    test2()
    # try:
    #     test2()
    # except:
    #     pass
    print("-" * 10 + "test3结束" + "-" * 10)

# try:
#     test3()
# except:
#     pass
test3()


raise自定义异常

自定义异常:

    自己创建异常类,继承Exception

抛出异常 raise  异常对象


PI = 3.14
class GenderError(Exception):
    class_id = 210
    def __init__(self):
        self.errMsg = '性别异常,只能设置为男或者女'

class Student():
    def __init__(self,name,gender):
        self.name = name
        # self.__gender = gender
        self.setGender(gender)

    def setGender(self,gender):
        if gender == '男' or gender  == '女':
            self.__gender = gender
        else:
            #抛出异常
            raise GenderError()
    def getGender(self):
        return self.__gender

def showInfo(stu):
    print(stu)

stu1 = Student('刘忙','男')
try:
    stu1.setGender('未知')
except Exception as e:
    print(type(e))
    print(e.args)
    print(e.errMsg)


over......


关键字:     Python基础       异常  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有