什么是异常?Python中常见的异常有哪些?

什么是异常?Python中常见的异常有哪些?
 

编程中,异常是一种特殊的事件,它打断了正常的程序执行流程。当程序遇到了某些它不能处理的问题时,就会抛出异常。这些问题可能包括读取不存在的文件、除以零、输入无效的数据等。异常处理机制允许程序在发生错误时,采取一些特定的措施,而不是直接崩溃。

在Python中,异常是以类的形式存在的,所有的异常都是BaseException的子类,其中Exception是大多数异常的基类。Python内置了一些常见的异常类型,包括:

  1. ZeroDivisionError:除数为零时触发。
  2. IndexError:访问序列(如列表、元组或字符串)中不存在的索引时触发。
  3. KeyError:访问字典中不存在的键时触发。
  4. NameError:尝试访问一个未被定义的变量时触发。
  5. TypeError:对某个对象执行了不支持的操作时触发,如将一个字符串与一个整数相加。
  6. ValueError:传入无效的参数值时触发,如在某个函数中传入了一个错误的参数类型。
  7. AttributeError:尝试访问对象的属性或方法时,该对象没有这个属性或方法时触发。
  8. FileNotFoundError:尝试打开不存在的文件时触发。
  9. IOError:输入/输出操作失败时触发。

此外,Python还允许你自定义异常,通过继承内置的Exception类来创建。这使得你可以在特定情况下抛出自己的异常,或者在更广泛的异常类型无法满足你的需求时使用自定义的异常。

处理异常通常使用try/except语句。try块包含可能引发异常的代码,而except块则包含处理这些异常的代码。如果try块中的代码引发了异常,并且该异常与某个except块中指定的异常类型匹配,那么就会执行该except块中的代码。


如何使用try-except语句处理异常?
 

在Python中,try-except语句用于捕获和处理异常。当try块中的代码引发异常时,程序会立即跳转到匹配的except块,而不是终止执行。在except块中,你可以编写处理异常的代码,比如记录错误信息、清理资源、或者尝试使用不同的方法继续执行。

下面是try-except语句的基本语法:

 

python复制代码

try:
# 尝试执行的代码块,可能会引发异常
pass # 这里放你的代码
except ExceptionType:
# 处理特定类型的异常的代码块
pass # 这里放你的异常处理代码
# 可以有多个except块来处理不同类型的异常
except AnotherExceptionType:
pass # 处理另一种异常的代码
# 也可以有一个通用的except块捕获所有异常
except:
pass # 处理所有未被前面except块捕获的异常
else:
# 如果没有异常发生,则执行这里的代码块
pass # 可选
finally:
# 无论是否发生异常,都会执行这里的代码块
# 常用于清理资源,如关闭文件、释放锁等
pass # 可选

这里是一个简单的例子,展示了如何使用try-except语句处理除数为零的异常:

 

python复制代码

try:
x = 10 / 0 # 这会引发ZeroDivisionError异常
except ZeroDivisionError:
print("错误:不能除以零")
except Exception as e:
print("发生了一个未知异常:", e)
else:
print("没有发生异常,计算结果是:", x)
finally:
print("这是finally块,无论是否发生异常都会执行")

在上面的例子中,当尝试执行x = 10 / 0时,会触发ZeroDivisionError异常。except ZeroDivisionError块会捕获这个异常,并打印出错误消息。如果try块中的代码没有引发异常,则会执行else块中的代码。无论是否发生异常,finally块中的代码都会执行。

注意,你也可以使用except块而不指定异常类型,这将会捕获所有类型的异常。但是,这通常不是一个好的做法,因为它会隐藏潜在的错误。最好是尽可能具体地指定你期望处理的异常类型。

此外,你还可以使用as关键字将异常实例赋值给一个变量,以便在except块中访问它。这在记录异常信息或重新抛出异常时特别有用。

最后,如果你的异常处理代码非常简单,只是打印错误信息或者记录日志,你也可以使用Python 3.8及以上版本的except语句的新特性——walrus operator (:=),在except块中直接捕获并赋值:

 

python复制代码

try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"捕获到异常: {e}")

或者使用walrus operator:

 

python复制代码

try:
x = 10 / 0
except (e := ZeroDivisionError):
print(f"捕获到异常: {e}")

在上面的例子中,e变量会在except块被触发时捕获ZeroDivisionError实例。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值