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 """

 

上一篇:SQL优化--inner、left join替换in、not in、except


下一篇:mooc openjudge 014 MyString对运算符重载的综合使用