100天带你精通Python——第7天错误和异常

请添加图片描述


前言

在Python编程中,错误和异常处理是关键的组成部分,帮助开发者识别和管理程序运行中的问题。了解这些机制不仅有助于调试代码,还能提高代码的鲁棒性和用户体验。
在这里插入图片描述


一、错误与异常的基本概念

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

2.1、错误(Errors)

错误(Errors):指程序在编译或运行时发生的问题,通常由语法不正确或其他严重问题引起。错误一般不能被程序捕捉和处理,代码通常需要修复错误后才能正常运行。

常见错误类型:

  • SyntaxError:语法错误。例如,缺少括号或错误的缩进。
  • IndentationError:缩进错误。Python要求严格的缩进来表示代码块的开始和结束。

2.2、异常(Exceptions)

异常(Exceptions):指在程序运行时发生的异常情况,通常是由于不符合预期的输入或其他运行时条件引起的。与错误不同,异常可以被捕捉和处理,以防止程序崩溃。

常见异常类型:

  • TypeError:类型错误。例如,对不支持的操作数类型进行操作。
  • ValueError:值错误。例如,将无法转换为整数的字符串传递给int()函数。
  • IndexError:索引错误。例如,访问列表中不存在的索引。
  • KeyError:键错误。例如,访问字典中不存在的键。
  • FileNotFoundError:文件未找到错误。例如,尝试打开一个不存在的文件。
  • ZeroDivisionError:零除错误。例如,除数为零。
  • AttributeError:属性错误。例如,对没有该属性的对象调用方法。

2.2.1 try/except

异常捕捉可以使用 try/except 语句。

在这里插入图片描述
以下例子中,让用户输入一个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发一个 KeyboardInterrupt 异常。

while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

try 语句按照如下方式工作:

  1. 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。

  2. 如果没有异常发生,忽略 except 子句,try 子句执行后结束。

  3. 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

  4. 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

  5. 一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

  6. 处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

2.2.2 try/except…else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。else 子句将在 try 子句没有发生任何异常的时候执行。
在这里插入图片描述
以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

2.2.3 try-finally

try-finally 语句无论是否发生异常都将执行最后的代码。
在这里插入图片描述
以下实例中 finally 语句无论异常是否发生都会执行:

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

2.3、抛出异常

Python 使用 raise 语句抛出一个指定的异常。
在这里插入图片描述

x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

2、自定义异常

在某些情况下,你可能需要定义自己的异常类型来处理特定的错误条件。可以通过继承内置的Exception类来创建自定义异常。

class CustomError(Exception):
    pass

def test_function(value):
    if value < 0:
        raise CustomError("Value cannot be negative.")  # 引发自定义异常
    return value

try:
    test_function(-1)
except CustomError as e:
    print(f"CustomError: {e}")  # 捕捉并处理自定义异常

总结

错误和异常处理是Python编程中不可或缺的部分。掌握如何有效地处理这些问题,不仅可以帮助你在程序运行中捕捉和修复问题,还能提高程序的鲁棒性和用户体验。通过合理使用异常处理机制和自定义异常,你可以使你的代码更健壮和可靠。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值