Python基础语法入门(第二十一天)——异常处理

在Python中,异常处理是一种机制,用于捕获和处理在程序执行过程中发生的错误。

Python中的异常处理可以使用try-except语句块来实现。try语句块可能包含可能出现错误的代码段,而except语句块包含处理错误的代码段。当try语句块中的代码发生错误时,程序跳转到相应的except语句块中执行。

基本定义

异常是程序执行过程中出现的影响程序正常执行的一个事件。当异常产生时如果没有对异常进行捕获并处理则程序会终止执行。异常处理就是让程序在处理完异常之后继续正常执行从而使程序不至于在出现异常时导致退出或崩溃。常见的异常类型如下:

Exception:所有异常的基类。可以用来捕获任何类型的异常。
ValueError:当一个函数接收到一个无效的参数时引发。
TypeError:当一个操作或函数应用于不适当类型的对象时引发。
IndexError:当访问一个不存在的列表索引或字符串索引时引发。
KeyError:当访问一个不存的字典键时引发。
FileNotFoundError:当试图打开一个不存在的文件时引发。

异常捕获

异常处理的基本语法如下:

try:
  # 可能出现错误的代码
except ExceptionType:
  # 处理错误的代码

关键字try后是可能出现错误的代码段。

关键字except后是异常类型,用来指定处理哪种类型的错误。可以通过ExceptionType捕获特定异常的类型,也可以用except关键字单独捕获所有的异常。

示例:

try:
  numbers = [1, 2, 3]
  print(numbers[3])  # 超出列表长度引发IndexError异常
except IndexError:
  print("Index out of range")  # 错误处理代码

执行结果:

在这里插入图片描述

在这个示例中,try语句块中的代码尝试访问一个索引超出列表长度的元素。由于会引发一个IndexError异常,程序会跳转到except语句块中执行,输出"Index out of range"。注意:一个异常处理模块至少有一个try和一个except。

如果不捕获异常的话代码执行结果如下图所示:

在这里插入图片描述

异常处理机制增强

除了基本的try-except语句,还可以使用其他关键字来增强异常处理机制。例如:

else:定义在try语句块结束后,并且没有引发异常时执行的代码段。
finally:定义在try-except语句块结束后总是执行的代码段,不管是否引发异常。

示例

try:
  x = 10 / 0
except ZeroDivisionError:
  print("Cannot divide by zero")
else:
  print("Division successful")  # 此代码段不会执行,因为有异常发生
finally:
  print("Finally block executed")  # 总是会执行,不管是否有异常发生

在这个示例中,try语句块中的代码尝试将10除以0,引发一个ZeroDivisionError异常。因此,程序跳转到except语句块中执行,输出"Cannot divide by zero"。else语句块中的代码不会执行,最后会执行finally语句块中的代码,输出"Finally block executed"。

自定义异常类

在Python中是允许用户定义自己的异常类的,以便将特定类型的错误与标准异常区分开来。自定义异常类可以继承自Exception基类或其子类,以获得标准异常类的特性。请看下方示例:

class MyCustomException(Exception):
  pass

try:
  raise MyCustomException("This is a custom exception")
except MyCustomException as e:
  print(e)  # 输出自定义异常的错误信息

在这个示例中,定义了一个自定义异常类MyCustomException,它继承自Exception类。然后,使用raise关键字引发自定义异常,并传递错误消息作为参数。接着,使用except语句捕获自定义异常,并打印错误消息。

通过自定义异常类,可以将程序中的特定错误归类为不同的异常类型,从而使错误处理更加准确和可读。同时,还可以根据需要为自定义异常类添加额外的属性和方法,以满足特定的错误处理需求。

以下是一个稍复杂的示例,演示如何在自定义异常类中添加属性和方法:

class InvalidInputError(Exception):
  def __init__(self, message, input_value):
    super().__init__(message)
    self.input_value = input_value

  def get_input(self):
    return self.input_value

try:
  value = "abc"
  if not value.isdigit():
    raise InvalidInputError("Invalid input", value)
except InvalidInputError as e:
  print(e)  # 输出错误消息
  print(e.get_input())  # 输出输入值

在这个示例中,自定义异常类InvalidInputError添加了一个名为input_value的属性,用于存储错误的输入值。在异常类的构造函数中,使用super().__init__()调用基类的构造函数,并传递错误消息作为参数。然后,使用get_input()方法获取输入值。

在try语句块中,如果值不是数字,就会引发自定义异常。在except语句块中,可以访问异常对象的属性和方法,以获取错误信息和输入值。

通过自定义异常类,可以根据不同的错误情况提供更具体的错误信息和处理方法,从而提高代码的可读性和维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

quanmoupy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值