当前位置: 首页 > news >正文

python入门基础知识(错误和异常)

本文部分内容来自菜鸟教程Python 基础教程 | 菜鸟教程 (runoob.com) 本人负责概括总结代码实现。

以此达到快速复习目的

目录

语法错误

异常

异常处理

try/except

try/except...else

try-finally 语句

抛出异常

用户自定义异常

内置异常类型

常见的标准异常类型


语法错误

Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例

这个例子中,函数 print() 被检查到有错误,是它前面缺少了一个冒号 : 。

语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。

异常

即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

异常处理

try/except

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

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

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

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

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

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

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

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

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

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

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

  • sys.exc_info():这是一个Python内置函数,它返回一个包含异常信息的元组 (type, value, traceback)

    • type:异常的类型。
    • value:异常实例。
    • traceback:异常的追溯对象。
  • sys.exc_info()[0]:这个表达式获取异常类型,即上面元组中的第一个元素。

try/except...else

try/except 语句还有一个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

以下实例中 finally 语句无论异常是否发生都会执行:

抛出异常

Python 使用 raise 语句抛出一个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]

raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出。

用户自定义异常

你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

在这个例子中,类 Exception 默认的 __init__() 被覆盖。

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

内置异常类型

  1. Exception:

    • 所有内置异常的基类。通常用作自定义异常类的基类。
  2. BaseException:

    • 所有异常的基类,包括系统退出和中断等。
  3. SystemExit:

    • 由 sys.exit() 函数引发,用于退出解释器。
  4. KeyboardInterrupt:

    • 当用户按下中断键(通常是 Ctrl+C 或 Delete)时引发。
  5. GeneratorExit:

    • 当生成器(使用 yield 关键字的函数)关闭时引发。

常见的标准异常类型

  1. ArithmeticError:

    • 数学运算错误的基类。
    • ZeroDivisionError: 除法或模运算的第二个参数为零时引发。
    • OverflowError: 数值运算结果超出了表示范围时引发。
    • FloatingPointError: 浮点运算失败时引发。
  2. AttributeError:

    • 试图访问不存在的对象属性时引发。
  3. BufferError:

    • 与缓冲区相关的操作失败时引发。
  4. EOFError:

    • 输入函数到达文件末尾时引发(例如 input())。
  5. ImportError:

    • 导入模块失败时引发。
    • ModuleNotFoundError: 找不到模块时引发(ImportError 的子类)。
  6. LookupError:

    • 查找序列或映射中的无效键或索引时引发。
    • IndexError: 序列索引超出范围时引发。
    • KeyError: 映射中找不到键时引发。
  7. MemoryError:

    • 操作内存分配失败时引发。
  8. NameError:

    • 试图访问未声明的变量时引发。
    • UnboundLocalError: 访问未绑定局部变量时引发(NameError 的子类)。
  9. OSError:

    • 操作系统相关错误的基类。
    • FileNotFoundError: 文件或目录不存在时引发。
    • PermissionError: 权限不足时引发。
    • NotADirectoryError: 操作期望一个目录但却得到一个文件时引发。
    • IsADirectoryError: 操作期望一个文件但却得到一个目录时引发。
  10. ReferenceError:

    • 试图访问通过弱引用回收的对象时引发。
  11. RuntimeError:

    • 在检测到不合适的条件时引发。
    • NotImplementedError: 尚未实现的方法被调用时引发。
  12. SyntaxError:

    • Python 语法错误时引发。
    • IndentationError: 缩进错误时引发。
    • TabError: 混合使用制表符和空格导致的缩进不一致时引发。
  13. TypeError:

    • 操作或函数应用于不适当类型的对象时引发。
  14. ValueError:

    • 操作或函数接收到具有正确类型但不合适的值时引发。
  15. StopIteration:

    • next() 函数在迭代器没有更多项时引发。
  16. StopAsyncIteration:

    • await anext() 在异步迭代器没有更多项时引发。

相关文章:

  • 兴顺物流管理系统的设计
  • 从开源EPR产品Odoo学习
  • Java之Hutool/Guava/Apache Commons工具包项目实践
  • Node.js 渲染三维模型并导出为图片
  • 后仿真中的 《specify/endspecify block》之(5)使用specify进行时序仿真
  • 【区分vue2和vue3下的element UI Descriptions 描述列表组件,分别详细介绍属性,事件,方法如何使用,并举例】
  • GPT-4o一夜被赶超,Claude 3.5一夜封王|快手可灵大模型推出图生视频功能|“纯血”鸿蒙大战苹果AI|智谱AI“钱途”黯淡|月之暗面被曝进军美国
  • 4、MFC:菜单栏、工具栏与状态栏
  • CompletableFuture 基本用法
  • 实战|YOLOv10 自定义目标检测
  • 数学建模 —— 查找数据
  • Tomcat基础详解
  • 【MATLAB】语法
  • atcoder abc 358
  • 【免费】中国电子学会2024年03月份青少年软件编程Python等级考试试卷一级真题(含答案)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • .pyc 想到的一些问题
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • ES6语法详解(一)
  • happypack两次报错的问题
  • Laravel Mix运行时关于es2015报错解决方案
  • PHP 小技巧
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • React 快速上手 - 07 前端路由 react-router
  • vue-loader 源码解析系列之 selector
  • Vue--数据传输
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 汉诺塔算法
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 如何学习JavaEE,项目又该如何做?
  • 运行时添加log4j2的appender
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # Maven错误Error executing Maven
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (论文阅读40-45)图像描述1
  • (七)Knockout 创建自定义绑定
  • (三)终结任务
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (自用)gtest单元测试
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net多线程Threading相关详解
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)