【Python】异常处理:try+except和断言assert

原文作者:我辈李想

版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。


文章目录

  • 前言
  • 一、常见用法
  • 二、内置异常类
  • 三、else和finally
  • 四、自定义异常
    • 1.异常类
    • 2.抛出异常
    • 五、捕获异常的详细信息
      • 1.获取异常的堆栈跟踪
      • 2.获取异常发生的文件和行号
      • 3.获取异常的字符串输出,写入日志
      • 六、断言assert

        前言

        在 Python 中,异常是一种表示程序执行期间发生错误的方式。当出现异常时,程序会停止执行,并且根据异常类型决定是否终止程序。

        为了避免程序终止,我们可以使用异常处理来捕获和处理异常。在 Python 中,我们使用 try-except 语句来实现异常处理。try 块包含可能会引发异常的代码,而 except 块用于处理异常。


        一、常见用法

        try:
            num1 = int(input("请输入一个数字:"))
            num2 = int(input("请输入另一个数字:"))
            result = num1 / num2
            print("结果为:", result)
        except ZeroDivisionError:
            print("除数为零错误!")
        except ValueError:
            print("输入的不是数字!")
        

        在这个例子中,我们使用 try-except 语句来处理可能会引发异常的除法操作。如果 num2 为零,则会引发 ZeroDivisionError 异常,如果输入的不是数字,则会引发 ValueError 异常。根据具体情况,我们使用两个 except 块来处理这两种异常。

        二、内置异常类

        Python中有许多内置异常(built-in exceptions),它们都是预定义的异常类型,可以在代码中被触发和处理。以下是一些常见的内置异常:

        1. ValueError:当传递给函数或方法的参数类型不正确或者参数的值不合法时,会引发此异常。

        2. TypeError:当使用了错误的数据类型或数据类型不匹配时,会引发此异常。

        3. IndexError:当尝试访问序列中不存在的元素时,会引发此异常。

        4. KeyError:当尝试使用字典中不存在的键时,会引发此异常。

        5. ZeroDivisionError:当尝试除以零时,会引发此异常。

        6. NameError:当尝试访问不存在的变量时,会引发此异常。

        7. IOError:当尝试读取不存在的文件或文件不可读时,会引发此异常。

        8. AttributeError:当尝试访问不存在的对象属性时,会引发此异常。

        9. NotImplementedError:当尝试调用尚未实现的方法或函数时,会引发此异常。

        10. KeyboardInterrupt:当用户中断程序的执行时,会引发此异常。

        以上是常见的内置异常类型,但 Python 还有许多其他类型的异常。

        三、else和finally

        除了使用 except 块来处理异常,我们还可以使用 finally 块来执行一些必要的清理操作。无论是否出现异常,finally 块中的代码都会被执行。

        示例:

        try:
            num = int(input("请输入一个数字:"))
            result = 10 / num
            print("结果为:", result)
        except ZeroDivisionError:
            print("除数为零错误!")
        else:
            print("可以获得num值",num )
        

        示例:

        try:
            file = open("test.txt","w")
            file.write("Hello World")
        except:
            print("文件操作失败")
        finally:
            file.close()
        

        在这个例子中,我们使用 finally 块来输出程序执行结束的信息,以确保无论是否出现异常,都会输出这个信息。

        我们常用的with open(‘xx.txt’,‘w’) 打开文件实现的就是类似finally的功能。

        finally的真正作用

        def func():
        	try:
        		return 'try'
        	finally:
        		return 'finally'
        print(func())
        
        finally
        
        def func():
        	try:
        		return 'try'
        	finally:
        		print('finally')
        print(func())
        
        finally
        try
        

        四、自定义异常

        1.异常类

        定义自己的异常处理其实很简单,继承内置 Exception 类就可以。

        class MyCustomException(Exception):
            def __init__(self, code , message):
                self.code = code 
                self.message = message
            def __str__(self):
                return (self.code ,self.message)
        

        2.抛出异常

        from xx import MyCustomException
        def test():
        	if 1==1:
        		raise MyCustomException(12305,"This is a custom exception.")
        	else:
        		return 
        try:
            test()
        except MyCustomException as e:
            print(e)
        

        结果:(12305,“This is a custom exception.”)

        在上面的示例中,我们使用 raise 语句触发自定义异常,并使用 except 语句捕获它。由于我们在自定义异常类中定义了 str 方法,因此 print 语句将打印自定义异常消息。

        五、捕获异常的详细信息

        1.获取异常的堆栈跟踪

        import traceback
        try:
            # 可能会出现异常的代码块
        except Exception as e:
            # 处理异常的代码块
            print("异常类型:", type(e).__name__)
            print("异常信息:", str(e))
            print("堆栈跟踪:")
            traceback.print_tb(e.__traceback__)
        

        2.获取异常发生的文件和行号

        import traceback
        def divide(x, y):
            try:
                result = x / y
                print("结果:", result)
            except Exception as e:
                print("异常类型:", type(e).__name__)
                print("异常信息:", str(e))
                print("异常发生的文件和行号:")
                traceback.print_exc()
        divide(10, 2)
        divide(10, 0)
        

        3.获取异常的字符串输出,写入日志

        import traceback
        def divide(x, y):
            try:
                result = x / y
                print("结果:", result)
            except Exception as e:
                print("异常类型:", type(e).__name__)
                print("异常信息:", str(e))
                print("异常发生的文件和行号:")
                aa = traceback.format_exc()
                print(type(aa))
                print('11')
                print(aa)
        divide(10, 2)
        divide(10, 0)
        

        六、断言assert

        Python 中的断言 assert 是一个调试工具,用于在开发和调试过程中检查代码。当使用 assert 时,我们可以在代码中插入一些检查语句,以确保代码的正确性。

        如果断言的条件为 False,则会引发 AssertionError 异常,并且程序会停止执行。如果断言的条件为 True,则程序会继续执行,就像断言语句不存在一样。

        以下是一个简单的示例,在这个示例中,我们使用 assert 语句来检查代码中的条件:

        x = 5
        assert x > 3, "x 应该大于 3"
        

        在上面的代码中,我们使用断言来检查变量 x 是否大于 3。如果 x 的值小于或等于 3,则会引发 AssertionError 异常,并显示指定的错误消息。

        断言语句非常有用,在开发和调试过程中,可以用它们来检查代码的正确性,并在错误发生时快速定位问题。但请注意,在部署代码之前,请务必禁用或删除所有断言语句。