Python基础:错误和异常

news2024/12/29 11:19:08

在这里插入图片描述

  在Python中的错误可(至少)被分为两种:语法错误异常,均是指在程序中发生的问题和意外情况。Python提供了异常处理机制,使程序能够更容易地应对这些问题。

1. 语法错误(Syntax Error)

  语法错误,又称解析错误,是Python中常见的错误,主要是因为代码不符合Python语法规则而引起的错误,它们在代码解析阶段就会被检测,因此程序无法继续执行。解析器会复现出现句法错误的代码行,并用小“箭头”指向行里检测到的第一个错误。
  下面是一些语法错误的示例:
  1)缺少冒号

while True print('hello world')
``![在这里插入图片描述](https://img-blog.csdnimg.cn/baf0b6e94ae04a0b9fc40891e8de5fcb.png#pic_center)
  **2)括号不匹配**

```python
print('hello world!'

在这里插入图片描述
  3)缩进错误

if True:
print('Indented incorrectly')

在这里插入图片描述
  4)关键字拼写错误

whil True:
print('Misspelled keyword')

在这里插入图片描述

2. 异常

  即使语句或表达式使用了正确的语法,执行时仍可能触发错误。执行时检测到的错误称为 异常,异常不一定导致严重的后果。大多数异常是由于程序错误、外部调减变化或其他意外情况引起的,不会被程序处理,而是显示错误信息,下面示例说明:
  1)零除错误(ZeroDivisionError)

# ZeroDivisionError 的示例
result = 10 / 0

在这里插入图片描述
  2)NameError

# NameError 的示例
print(undefined_variable)

在这里插入图片描述
  3)类型错误(TypeError)

# TypeError 的示例
result = "5" + 3

在这里插入图片描述
  4) 运行时异常

# 未明确指定异常引发 RuntimeError
def example_function():
    raise RuntimeError("An unspecified runtime error occurred.")

example_function()

在这里插入图片描述
  内置异常结构:
BaseException
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ExceptionGroup [BaseExceptionGroup]
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
│ ├── UnicodeDecodeError
│ ├── UnicodeEncodeError
│ └── UnicodeTranslateError
└── Warning
├── BytesWarning
├── DeprecationWarning
├── EncodingWarning
├── FutureWarning
├── ImportWarning
├── PendingDeprecationWarning
├── ResourceWarning
├── RuntimeWarning
├── SyntaxWarning
├── UnicodeWarning
└── UserWarning

3. 异常的处理

  异常处理是一种在程序执行过程中检测、响应和处理异常的机制。在 Python 中,异常处理通常使用 tryexceptelsefinally关键字。
  try语句的工作原理如下:
  1)首先,执行 try 子句tryexcept关键字之间的(多行)语句)。
  2)如果没有触发异常,则跳过except 子句,try语句执行完毕。
  3)如果在执行 try子句时发生了异常,则跳过该子句中剩下的部分。 如果异常的类型与 except关键字后指定的异常相匹配,则会执行 except 子句,然后跳到 try/except 代码块之后继续执行。
  4)如果发生的异常与except 子句 中指定的异常不匹配,则它会被传递到外部的 try语句中;如果没有找到处理程序,则它是一个 未处理异常 且执行将终止并输出如上所示的消息。
  try 语句可以有多个 except 子句 来为不同的异常指定处理程序。 但最多只有一个处理程序会被执行。 处理程序只处理对应的 try 子句 中发生的异常,而不处理同一try语句内其他处理程序中的异常。 except 子句 可以用带圆括号的元组来指定多个异常。
  下面是异常处理的基本结构:

try:
    # 尝试执行可能引发异常的代码
    num = int(input("Enter a number: "))
    result = 10 / num
except ZeroDivisionError:
    # 处理除以零的异常
    print("Cannot divide by zero.")
except ValueError as ve:
    # 处理输入非整数的异常
    print(f"Invalid input: {ve}")
else:
    # 如果没有异常发生时执行的代码
    print(f"Result: {result}")
finally:
    # 无论是否发生异常都执行的代码
    print("Execution complete.")

  try块包含可能引发异常的代码。
  如果在try 块中发生异常,程序将跳转到匹配的 except 块来处理异常。
  except 块可以捕获特定类型的异常,并提供相应的处理代码。
  else块包含在没有异常发生时执行的代码。
  finally 块包含无论是否发生异常都会执行的代码,通常用于清理工作。

3. 触发异常

  可以使用raise 语句来主动触发异常。raise 语句允许你在程序执行过程中引发特定类型的异常,以便在需要的时候中断程序的正常流程并执行相应的异常处理代码。

def divide_numbers(a, b):
    if b == 0:
        raise ValueError("Cannot divide by zero.")
    else:
        return a / b

try:
    result = divide_numbers(10, 2)
    print(f"Result: {result}")
    
    # 触发异常
    result = divide_numbers(5, 0)
    print(f"Result: {result}")  # 这一行不会被执行
except ValueError as ve:
    print(f"Caught a ValueError: {ve}")
finally:
    print("Execution complete.")

在这里插入图片描述

  在这个例子中,divide_numbers函数尝试执行除法操作。如果除数 b 是零,就会触发 ValueError 异常,指示不能除以零。在 try 块中,先调用了 divide_numbers(10, 2),然后再调用了 divide_numbers(5, 0)。由于除以零,导致了ValueError异常的触发。

4. 引发和处理多个不相关异常

  在有些情况下,有必要报告几个已经发生的异常。这通常是在并发框架中当几个任务并行失败时的情况,但也有其他的用例,有时需要是继续执行并收集多个错误而不是引发第一个异常。
  内置的 ExceptionGroup打包了一个异常实例的列表,这样它们就可以一起被引发。它本身就是一个异常,所以它可以像其他异常一样被捕获。

def f():
    excs = [OSError('error 1'), SystemError('error 2')]
    raise ExceptionGroup('there were problems', excs)
f()

  引发异常信息:
在这里插入图片描述  捕获异常:

# 捕获异常 输出 caught <class 'ExceptionGroup'>: e
try:
    f()
except Exception as e:
    print(f'caught {type(e)}: e')

5. 用注释细化异常情况

  当一个异常被创建以引发时,它通常被初始化为描述所发生错误的信息。在有些情况下,在异常被捕获后添加信息是很有用的。为了这个目的,异常有一个 add_note(note) 方法接受一个字符串,并将其添加到异常的注释列表。标准的回溯在异常之后按照它们被添加的顺序呈现包括所有的注释。

try:
    raise TypeError('bad type')
except Exception as e:
    e.add_note('Add some information')
    e.add_note('Add some more information')
    raise

在这里插入图片描述
  例如,当把异常收集到一个异常组时,可能想为各个错误添加上下文信息。在下文中,组中的每个异常都有一个说明,指出这个错误是什么时候发生的。

def f():
    raise OSError('operation failed')
excs = []
for i in range(3):
    try:
        f()
    except Exception as e:
        e.add_note(f'Happened in Iteration {i+1}')
        excs.append(e)
raise ExceptionGroup('We have some problems', excs)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1227022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++算法入门练习——树的带权路径长度

现有一棵n个结点的树&#xff08;结点编号为从0到n-1&#xff0c;根结点为0号结点&#xff09;&#xff0c;每个结点有各自的权值w。 结点的路径长度是指&#xff0c;从根结点到该结点的边数&#xff1b;结点的带权路径长度是指&#xff0c;结点权值乘以结点的路径长度&#x…

前端必备工具

一、百度Ai功能合集 https://chat.baidu.com/ 二、超级复制 这是一个edge插件&#xff0c;那些禁止复制的文本&#xff0c;用这个插件点一下图标&#xff0c;会把当前网页解除禁止复制。 三、集中工具箱 例如一键抠图&#xff0c;感觉还可以&#xff1a; 四、代码漂亮截图 几…

七、文件包含漏洞

一、文件包含漏洞 解释&#xff1a;文件包含漏洞是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行&#xff1b;其还能够使得服务器上的源代码被读取&#xff0c;在PHP里面我们把可重复使用的函数写入到单个文件中&#x…

三菱PLC 模拟量输出模拟量转换功能块S_RTI(内嵌ST)

模拟量输出模拟量转换功能块S_RTI算法原理和公式介绍请参考下面文章链接: PLC模拟量输出 模拟量转换FC S_RTI-CSDN博客文章浏览阅读5.3k次,点赞2次,收藏11次。1、本文主要展示西门子博途模拟量输出转换的几种方法, 方法1:先展示下自编FC:计算公式如下:intput intput Rea…

linux 定时执行脚本

先写一个简单的shell脚本用来测试定时执行脚本 [rootVM-12-12-centos wz]# cat shell_cron_test.sh #!/bin/bashif [ -f "/home/wz/cron_test.txt" ];thennum$(($(wc -l /home/wz/cron_test.txt | cut -d -f 1)1))elsenum1 fi echo "$(date "%y-%m-%d …

在线代码调试运行微信开放平台官方接口调试校验工具大全

具体前往&#xff1a;在线代码调试&API校验工具大全

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE &#xff08;含2.0以上版本&#xff09;默认库文件位置的方法。 原创文章&#xff0c;转载请注明出处&#xff1a; 【实用技巧】更改ArduinoIDE默认库文件位置&#xff0c;解放C盘&#xff0c;将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…

JavaScript职责链模式

JavaScript职责链模式 1 什么是职责链模式2 举个例子3 用职责链模式重构代码4 灵活可拆分的职责链节点5 异步的职责链 1 什么是职责链模式 职责链模式是一种行为型设计模式&#xff0c;它允许将请求沿着处理者链进行传递&#xff0c;直到其中一个处理者能够处理该请求为止&…

Flutter笔记:缩放手势

Flutter笔记 缩放手势 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134485138 目 录 1. 概述2. 缩放手…

QGroundControl源码编译的三种方法

1.使用QtCreator编译: 下载qgroundcontrol源码 https://github.com/mavlink/qgroundcontrol.git 克隆 同步子模块 使用打开qgroundcontrol.pro 打开前要求先安装qt 5.15.2

【神印王座】月夜大尺度诱惑,皓晨潜入月魔宫,枫秀降临男扮女装

Hello,小伙伴们&#xff0c;我是拾荒君。 为了能安全回到联盟&#xff0c;龙皓晨决定让月夜商队护送他们&#xff0c;这也是他们目前处境更快更安全回到人类境地的方法。于是&#xff0c;龙皓晨只身一人去寻找月夜&#xff0c;此次执行的任务完全超出龙皓晨的掌握之外&#xf…

数据结构与算法-图

图 &#x1f388;2.图的存储结构&#x1f4d6;2.4.2邻接表的存储✅2.4.2.1逆邻接表✅2.4.2.2邻接表存储结构的定义✅2.4.2.3邻接表存储结构的类定义✅2.4.2.4创建n个顶点m条边的无向网✅2.4.2.5创建n个顶点m条边的有向网✅2.4.2.6定位操作-查找定点信息在顶点数组中的下标✅2.4…

操作系统:操作系统教程第六版(骆斌、葛季栋、费翔林)习题一计算机操作系统概述

目录 前言1. 思考题2. 应用题 前言 本系列文章是针对操作系统教程第六版&#xff08;骆斌、葛季栋、费翔林&#xff09;的习题解答&#xff0c;其中简答题部分为博主自己搜索整理的&#xff0c;错漏之处在所难免。应用题部分有答案为依据。 1. 思考题 &#xff08;1&#xf…

算数通关村第十一关-白银挑战位运算高频题

位移的运算 位1的个数 描述 : 编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 题目 : LeetCode 191.位1的个数 191. 位1的个数…

pr出现由于找不到msvcp110.dll,无法继续执行代码怎么办?如何修复

为什么我们在打开运行电脑软件会出现msvcr110.dll无法继续执行此代码的问题呢&#xff1f;因为msvcr110.dll是Microsoft Visual C Redistributable Package for Visual Studio 2013的一个动态链接库。它是一个重要的组件&#xff0c;用于帮助游戏和软件运行。如果某个程序是用它…

程序的编译链接以及装载

目录 一、预处理 二、编译 三、汇编 四、链接 五、装载 一、预处理 读取c源程序&#xff0c;对其中的伪指令&#xff08;以#开头的指令&#xff09;和特殊符号进行处理&#xff0c; 伪指令主要包括以下五个方面&#xff1a; 宏定义指令&#xff0c;如#define Name Token…

BUUCTF [BJDCTF2020]你猜我是个啥 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 来源&#xff1a;https://github.com/BjdsecCA/BJDCTF2020 密文&#xff1a; 下载附件&#xff0c;得到一个zip压缩包。 解题思路&#xff1a; 1、尝试解压压缩包&#xff0c;提示“attachment_10.zip”不是压缩文…

安装宝塔,使用宝塔自动部署

这里用的是华为云服务器&#xff0c;其实也就是普普通通的一个linux操作系统 首先我们来到宝塔官网地址 宝塔面板下载&#xff0c;免费全能的服务器运维软件 (bt.cn) 翻到下面&#xff0c;会有使用脚本安装的命令。 yum install -y wget && wget -O install.sh https:/…

springboot集成nacos并实现自动刷新

目录 1.说明 2.示例 3.自动刷新的注意点 1.说明 springboot项目中存在好多配置文件&#xff0c;比如配置数据信息&#xff0c;redis信息等等&#xff0c;配置文件可以直接放在代码&#xff0c;也可以放在像nacos这样的组件中&#xff0c;实现动态的管理&#xff0c;修改配置…

Springboot 对于数据库字段加密方案(此方案是对字符串处理的方案)

背景:在erp开发中&#xff0c;有些用户比较敏感数据库里的数据比较敏感&#xff0c;系统给用户部署后&#xff0c;公司也不想让任何人看到数据&#xff0c;所以就有了数据库字段加密方案。 技术 spring boot mybatisplus 3.3.1 mybatisplus 实际提供了 字段加密方案 第一 他…