Python入门-异常处理

异常处理

#try----else----  会一起执行
#finally无论如何,最后都会执行
def main():
    try:
        res = 10/2
        print("开始执行计算:",res)
    except ZeroDivisionError as z:
        print("代码执行有误:",z)
    # except TypeError as z:
    #     print("代码执行有误:",z)
    else:
        print("else被执行了====")
    finally:    #不管前面如何,finally一定会执行!
        print("不管是否计算,程序已经执行完毕!")

if __name__ == '__main__':
    main()

如果try失败,else也不会执行,except会执行。

代码执行有误: division by zero
不管是否计算,程序已经执行完毕!

 

多个异常处理

def main():
    print("=======开始计算========")
    try:
        num = int(input("请输入数字:"))
        num2 = int(input("请输入数字:"))
        res = num / num2
        print("计算结果为:",res)
    except ZeroDivisionError as z:
        print("被除数不能为 0:", z)
    except ValueError as v:
        print("你输入的不是数字:", v)
    finally:
        print("=======执行完毕=======")
if __name__ == '__main__':
    main()
    """
    =======开始计算========
    请输入数字:32
    请输入数字:23
    计算结果为: 1.391304347826087
    =======执行完毕=======
    """

异常统一处理

#异常之间是,继承的关系,所有的异常,父类异常是:Exception
#当不知道会出现何种异常的时候,可以使用traceback
import traceback
def main():
    print("=======开始计算========")
    try:
        num = int(input("请输入数字:"))
        num2 = int(input("请输入数字:"))
        res = num / num2
        print("计算结果为:",res)
    except Exception  as z:
        print("Exception正在处理:", z)
    """
    except Exception  as z:
        print("Exception正在处理:", traceback.format_exc())
    """
    finally:
        print("=======执行完毕=======")
if __name__ == '__main__':
    main()

Exception正在处理: invalid literal for int() with base 10: 'dd'

Exception正在处理: division by zero

 

File "E:/code/hunjia_16/day07_0820/yichang/traceback_yichang.py", line 6, in main
num = int(input("请输入数字:"))
ValueError: invalid literal for int() with base 10: 'ddf'

 

抛出异常raise

def main():
    print("=======开始====================")
    try:
        raise NameError("【raise-Name异常】应该是输入的名字有误。")
    except Exception as e:
        print("这是Exception输出:", e)
        print("=====下面是traceback异常演示=====")
        print(traceback.format_exc())
main()
"""
=======开始====================
这是Exception输出: 【raise-Name异常】应该是输入的名字有误。
=====下面是traceback异常演示=====
Traceback (most recent call last):
  File "E:/code/hunjia_16/day07_0820/yichang/raise_yichang.py", line 16, in main
    raise NameError("【raise-Name异常】应该是输入的名字有误。")
NameError: 【raise-Name异常】应该是输入的名字有误。
"""
# 继承中的,子类继承父类的方法,父类抛出异常
class Message:
    def build(self): #如果使用父类的build方法,会报错
        raise NotImplementedError("【Message类】build方法,正在使用。")
class Me(Message):
    def build(self):
        print("【Me子类】build方法,已经覆写。")

if __name__ == '__main__':
    m1 = Message()
    m1.build()
"""
  File "E:/code/hunjia_16/day07_0820/yichang/raise_lei_jicheng.py", line 3, in build
    raise NotImplementedError("【Message类】build方法,正在使用。")
NotImplementedError: 【Message类】build方法,正在使用。
"""
def fun():
    try:
        raise NameError("【NameError】名称可能异常。")
    except Exception as e:
        print("【Exception】你的代码出bug啦。")
        raise TypeError("TypeError:可能是类型错误。") from e
        # raise TypeError("TypeError:可能是类型错误。") from None
        # from None就找不到源头
if __name__ == '__main__':
    try:
        fun()
    except Exception as e:
        #抛出异常原因
        print("Exception-main{}:运行程序,出现异常原因为:{}".format(e, e.__cause__))


"""
【Exception】你的代码出bug啦。
Exception-mainTypeError:可能是类型错误。:运行程序,出现异常原因为:【NameError】名称可能异常。

#from None的执行结果如下 Exception-mainTypeError:可能是类型错误。:运行程序,出现异常原因为:None
"""

 with处理异常

class Message:
    class Connect:
        def build(self):
            print("开始连线好友。。。")
            return True
        def close(self):
            print("已经断开消息链接。")

    def send(self, info):
        try:
            conn = Message.Connect()
            if conn.build():
                print("正在发送消息:", info)
            else:
                print("出问题了。")
        except Exception as e:
            print("消息延迟:", e)
        finally:
            conn.close()
            print("=====通话完成====")

if __name__ == '__main__':
    m  = Message()
    m.send("百度一下")
    m.send("www.baidu.com")

"""
开始连线好友。。。
正在发送消息: 百度一下
已经断开消息链接。
=====通话完成====
开始连线好友。。。
正在发送消息: www.baidu.com
已经断开消息链接。
=====通话完成====
"""

 

# 使用with语句,管理上下文,进行上下文开启,上下文退出操作
class Message:
    class Connect:
        def build(self):
            print("开始连线好友。。。")
            return True
        def close(self):
            print("已经断开消息链接。")
    def __enter__(self):
        print("=====with语句开始执行=====")
        self.conn = Message.Connect()
        if not self.conn.build():
            print("建立通话失败。")
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print("=====with语句结束了=======")
        self.conn.close()
    def send(self, info):
        print("正在发送消息:", info)

if __name__ == '__main__':
    with Message() as me:
        me.send("谷歌")
        me.send("www.google.com")
"""
=====with语句开始执行=====
开始连线好友。。。
正在发送消息: 谷歌
正在发送消息: www.google.com
=====with语句结束了=======
已经断开消息链接。
"""

with节省了性能,减少了打开关闭的操作。

自定义异常

#异常类不够使用,所以需要自定义异常
class BugException(Exception):
    def __init__(self, info):
        self.info = info
    def __str__(self):
        return  self.info

class Fun:
    @staticmethod
    def f(num):
        if num > 999:
            raise BugException("哎,不知道哪里出bug了。。")
        else:
            print("目前还没有问题,可以继续运行代码。")
if __name__ == '__main__':
    try:
        Fun.f(1111)
    except BugException as b:
        print("【BugException】异常处理:", b)

"""
【BugException】异常处理: 哎,不知道哪里出bug了。。
"""

 

posted @ 2021-08-20 22:46  zwx901323  阅读(45)  评论(0)    收藏  举报