python基础篇-异常捕获和抛出

一、异常的定义

在 Python 中,异常(Exception)指在程序执行期间出现的错误或异常情况。这些异常可能是由各种原因引起的,如输入错误、文件不存在、网络连接问题等。在 Python 中,可以使用 try/except 语句来捕捉异常,并在发生异常时执行特定的代码块。

二、常见的异常状况/异常类型

在 Python 中,常见的异常类型有:

  1. TypeError(类型错误):当一个操作或函数应用于不支持该操作或函数的对象类型时引发。

  1. ValueError(值错误):当一个操作或函数应用于正确类型的对象,但对象的值不适合该操作或函数时引发。

  1. IndexError(索引错误):当尝试访问一个不存在的索引或切片时引发。

  1. KeyError(键错误):当尝试访问一个不存在的字典键时引发。

  1. NameError(名称错误):当尝试访问一个未定义的变量或函数时引发。

  1. IOError(输入输出错误):当一个输入输出操作(例如打开文件或读写文件)失败时引发。

  1. ZeroDivisionError(除零错误):当试图除以零时引发。

  1. AttributeError(属性错误):当尝试访问一个不存在的对象属性时引发。

  1. KeyboardInterrupt(键盘中断错误):当用户按下键盘中断信号(Ctrl+C)时引发。

  1. Exception(异常):所有其他异常类型的基类。

三、异常的处理

  1. 异常捕获

以下是 Python 中常用的几种异常捕获方法:

  1. try-except 语句

try-except 语句是最常用的异常处理方式。它用于捕获代码中可能抛出的异常,并提供相应的处理逻辑。try 语句块中包含可能抛出异常的代码,而 except 语句块中包含处理异常的代码。

try:
    # 可能抛出异常的代码
except SomeException:
    # 处理异常的代码

  1. try-except-else 语句

try-except-else 语句与 try-except 语句类似,但它还包含一个 else 语句块。else 语句块包含的代码只有在 try 语句块中没有抛出异常时才会执行。

try:
    # 可能抛出异常的代码
except SomeException:
    # 处理异常的代码
else:
    # 没有异常时执行的代码

  1. try-except-finally 语句

try-except-finally 语句与 try-except 语句类似,但它还包含一个 finally 语句块。finally 语句块中包含的代码总是会被执行,无论 try 语句块中是否抛出异常。

try:
    # 可能抛出异常的代码
except SomeException:
    # 处理异常的代码
finally:
    # 总是会执行的代码

  1. 多个异常类型的捕获

try:
    # 可能会引发异常的代码
except ExceptionType1:
    # 处理异常类型 ExceptionType1 的代码
except ExceptionType2:
    # 处理异常类型 ExceptionType2 的代码
...
except ExceptionTypeN:
    # 处理异常类型 ExceptionTypeN 的代码
else:
    # 没有发生异常时执行的代码
finally:
    # 无论是否发生异常,都会执行的代码
如果 try 语句块中的代码抛出 ExceptionType1 异常,就会执行 except ExceptionType1 语句块中的代码。如果抛出 ExceptionType2 异常,就会执行 except ExceptionType2 语句块中的代码。

举例说明如何使用 try-except 语句块来捕获和处理代码异常:

try:
    # 可能会引发异常的代码
    num1 = int(input("请输入一个整数:"))
    num2 = int(input("请输入另一个整数:"))
    result = num1 / num2
    print("两数相除的结果为:", result)
except ValueError:
    # 处理输入非整数的异常
    print("输入的不是整数,请重新输入。")
except ZeroDivisionError:
    # 处理除数为 0 的异常
    print("除数不能为 0,请重新输入。")
except Exception as e:
    # 处理其他未知异常
    print("发生了未知异常:", e)
else:
    # 没有发生异常时执行的代码
    print("计算成功。")
finally:
    # 无论是否发生异常,都会执行的代码
    print("程序结束。")

在上面的示例中,我们使用 try-except 语句块来捕获和处理代码的异常。在 try 块中,我们尝试获取用户输入的两个整数,并计算它们的商。如果用户输入的不是整数,或者除数为 0,就会引发相应的异常。如果发生了其他未知的异常,则会被 except 块捕获。在 else 块中,我们定义了没有发生异常时要执行的代码。在 finally 块中,我们定义了无论是否发生异常,都要执行的代码。

  1. 异常抛出

raise 语句用于抛出异常。它可以接受一个异常类或异常实例作为参数。如果不提供参数,则会抛出最近的异常。

  1. 抛出指定的异常

if x < 0:
    raise ValueError("x 不能是负数")
ps:如果 x 的值小于 0,就会抛出一个 ValueError 异常,并将错误信息设置为 "x 不能是负数"

  1. 抛出自定义的异常

class MyException(Exception):
    pass

if some_condition:
    raise MyException("自定义异常信息")
ps:如果 some_condition 条件为真,就会抛出一个自定义的 MyException 异常,并将错误信息设置为 "自定义异常信息"

  1. 处理异常后重新抛出异常

try:
    # 可能抛出异常的代码
except SomeException as e:
    # 处理异常的代码
    raise AnotherException("重新抛出异常") from e
如果 try 语句块中的代码抛出 SomeException 异常,就会执行 except 语句块中的代码。在处理异常的代码中,可以使用 raise 关键字重新抛出异常,同时设置一个新的异常类型和错误信息。通过 from 关键字指定原始异常,这样可以保留原始异常的栈信息。

  1. 异常断言

在 Python 中,使用 assert 关键字进行异常断言。assert 语句用于在代码中检查某些条件是否为真。如果条件为假,则会抛出 AssertionError 异常。

assert condition, [message]    
其中, condition 是要检查的条件,如果为 False,就会抛出一个 AssertionError 异常。 message 是一个可选参数,用于指定错误信息。

举例如何对登录用户进行异常断言

def login(username, password):
    assert username != '', "用户名不能为空"
    assert password != '', "密码不能为空"
    # 其他登录逻辑

username = ''
password = '123456'
login(username, password)

四、异常处理的注意事项

在 Python 中,异常处理是一种常见的错误处理方式。虽然异常处理可以使我们的程序更加健壮、可靠和易于调试,但在实践中也需要注意以下几点:

  1. 尽可能精确地捕获异常:在捕获异常时,应该尽可能地精确指定要捕获的异常类型。如果捕获的异常类型太宽泛,可能会导致程序处理不当或无法正确诊断错误。

  1. 不要忽略异常:在捕获异常时,不要忽略异常或仅打印异常信息而不采取任何措施。否则可能会导致程序继续执行,并产生更加严重的问题。

  1. 在 finally 块中处理资源释放等操作:在处理异常时,可能需要进行资源释放等操作。为了确保这些操作能够被正确执行,应该将它们放在 finally 块中。

  1. 在处理异常时避免产生新的异常:在处理异常时,应该避免产生新的异常,因为这可能会导致原始异常被掩盖或错误处理。

  1. 使用上下文管理器管理资源:在 Python 中,可以使用上下文管理器来管理资源,例如文件、网络连接等。上下文管理器可以在进入和退出代码块时自动管理资源,从而避免资源泄漏和其他问题。

你可能感兴趣的:(python编程基础,pycharm,python)