Python的错误和异常处理

news2025/4/27 14:38:07

一、错误和异常

    编程中出现的错误大致可以分为两类:错误和异常。

(一)错误

    错误又可以分为两类:语法错误和逻辑错误。

1. 语法错误

    语法错误又称解析错误,它是指在编写程序时,程序的语法不符合Python语言的规范,导致程序无法被正确解析。这种错误通常由拼写错误、缺少冒号、括号不配对、语句以及引号等引起。

    例1 表达式括号不配对引发的语法错误。

图1 SyntaxError错误用例图

    例1中,第一行中是括号不配对,第二行变量名为关键词,引发SyntaxError。

    另外一切在编完程序到可以运行(通过编译),或者说通过编译之前发生的错误都归结到这里。

    例2 变量未定义就用于计算。

图1 NameError用例图

    例2中,s += i,相当于s = s + i,变量s没有定义,导致s += i无法执行,引发NameError。

    语法错误容易发现,改正前程序不能正常运行,系统会提供错误位置、错误类型和错误原因,用户可能根据这些信息修改错误。

2. 逻辑错误

    逻辑错误是指程序的逻辑不正确,导致程序无法按照用户期望的方式执行,或程序的算法不符合题目给出的逻辑。

    存在逻辑错误程序可以正常运行,但运行结果不正确。这种错误通常是由编程者的错误推理或理解偏差等引起的。比如已知三边求三角形面积,但程序却求的是周长等。

    例3 求闰年。如果年份能被4整除,但不能被100整除,那么这一年就是闰年。 如果年份能被100整除,但同时也能被400整除,那么这一年也是闰年。

   

    程序可以正常运行,但逻辑关系中的逻辑运算符用错,导致结果不正确。如只不能被100整除都将输出“闰年”。逻辑正确的程序如下:

 (二)异常

    异常也称运行时错误,是指在程序语法和逻辑都没有错误的情况下,程序在运行时出现的错误,这种错误可能是由于编程者的疏忽、系统资源不足或者外部因素引起的。常见的运行时错误有除零错误、索引错误、名称错误、输入/输出错误等。大多数异常不会被程序处理,从而导致程序中断,抛出错误。

    例4:两整数除法。

    正常输入,如输入6和4,程序正常输出“6÷4=1.5”,如图2(a)所示;当输入字母,如r,程序会抛出“ValueError”错误,如图2(b)所示;当输入带小数点的数,如45.5,程序也会抛出“ValueError”错误,如图2(c)所示。

图2 例4异常类型

    因此可以根据异常类型,结合出错原因,说明错误细节等进行异常的拦截与处理。

 ()异常的处理

    常见内置异常码见表1,表中列出了内置异常码及其含义(描述)

1 常见内置异常码表

    可以编写程序处理选定的异常。例5会要求用户一直输入内容,直到输入有效的整数。

    例5 输入一个整数,直到输入正确为止。

    当输入正确会进入异常处理,输入正确会break跳出“死”循环。

1. Python异常处理

    在 Python 中,可以使用 try... except... else...finally 的方式来捕获异常并进行处理。其语法格式如下:

try:
    正常的操作    # 可能出现异常的代码块
except [异常类型]:
    发生异常,执行这块代码      # 如果在try部份引发了'异常类型'异常
except [异常类型,数据]:
    发生异常,执行这块代码      # 如果引发了'异常类型'异常,获得附加的数据
except[异常类型]:
    发生异常,执行这块代码
else:
    如果没有异常执行这块代码
finally:
    无论是否发生异常都将执行最后的代码

    其中,try 语句块中的代码可能会出现异常,如果出现了指定类型的异常 ExceptionName,就会执行相应的 except 子句中的代码块。如果没有出现异常,那么 except finally 子句都不会执行,但会执行else子句中的代码块。而 finally 子句中的代码块无论如何都会在 try except 块执行完之后执行。

    例5 除数0的异常:

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except ZeroDivisionError:
    print('第2个数不能为0!')

    可拦截除零,但不能拦截非法输入。

    多个except子句

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except ValueError:
    print('请输入数字!')
except ZeroDivisionError:
    print('第2个数不能为0!')

   既可以拦截除零,也可以拦截非法输入。

   还可以不给except参数,空except捕捉所有异常,但区分不了异常。

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except:
    print('出了问题!')

as语句捕捉异常原因

try:
   num1 = int(input('请输入第1个数:'))
   num2 = int(input('请输入第2个数:'))
   print(num1 / num2)
except Exception as err:
   print('出了问题!')
   print(err)      # 输出异常原因

    也可以将多个异常码元组作为except参数,一个except块捕捉多个异常。

try:
    num1 = int(input('请输入第1个数:'))
    num2 = int(input('请输入第2个数:'))
    print(num1 / num2)
except (ValueError, ZeroDivisionError):
    print('无效输入!')

 (四)触发异常

    raise 语句支持强制触发指定的异常。例如:

    raise 唯一的参数就是要触发的异常。这个参数必须是异常实例或异常类(派生自 BaseException 类,例如 Exception 或其子类)

(五)用户自定义异常

    程序可以通过创建新的异常类命名自定义的异常。不论是以直接还是间接的方式,异常都应从Exception类派生。

    异常类可以被定义成能做其他类所能做的任何事,但通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。

    大多数异常命名都以 “Error” 结尾,类似标准异常的命名。本例命名为“CustomException”。

    许多标准模块定义了自己的异常,以报告他们定义的函数中可能出现的错误。

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

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

相关文章

虚拟机和Windows的文件传输

拖拽/复制粘贴 直接将虚拟机linux系统的文件拖曳到windows桌面,或者直接将windows的文件拖曳到虚拟机linux系统当中,可以实现文件传输。当然复制粘贴方式也可以,但是前提是需要下载安装好VMware tools。 共享文件夹 概念:在Win…

阿里在盘古云存储系统中部署RDMA的经验谈

1 阿里如何进行RDMA部署 1.1 RDMA部署规划中的考虑因素 存储集群的部署规划控制着网络拓扑结构、RDMA通信范围、存储节点配置等,必须考虑多种因素,包括存储容量与需求的匹配、硬件成本的控制、性能的优化、可用性和SLA风险的最小化。最终的结果是所有这…

cmake构建多项目编译

项目结构如下 CMakeLists清单 最外层的主CMakeLists cmake_minimum_required(VERSION 3.17) project(cmakeMulPackage)set(CMAKE_CXX_STANDARD 11)#添加一个子目录并构建该子目录 add_subdirectory(proj1) add_subdirectory(proj2)#定义头文件路径 include_directories(proj1…

【Linux】jdk、tomcat、MySQL环境搭建的配置安装,Linux更改后端端口

一、作用 工具的组合为开发者和系统管理员提供了构建和运行Java应用程序以及存储和管理数据的完整环境。 JDK(Java Development Kit):JDK是Java开发工具包,它提供了开发和运行Java应用程序所需的工具和库。通过安装JDK&#xff0c…

跟着Nature正刊学作图 | 双轴柱状+折线散点图!

📋文章目录 复现图片设置工作路径和加载相关R包读取数据集数据可视化计算均值和标准差可视化过程 跟着「Nature」正刊学作图,今天复现Nature文章中的一张双轴图–左边为分组柱状图、右边为折线散点图。 复现图片 图中的a是我们今天准备复刻的&#xff0c…

电子电器架构 —— 车载网关初入门(三)

电子电器架构 —— 车载网关初入门(三) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关…

深度学习数据集大合集—疾病、植物、汽车等

最近又收集了一大批深度学习数据集,今天分享给大家!废话不多说,直接上数据! 1、招聘欺诈数据集 招聘欺诈数据集:共收集了 200,000 条数据,来自三个网站。 该数据集共收集了 200.000 条数据,分别…

思维训练 第四课 省略句

系列文章目录 文章目录 系列文章目录前言一、省略的十五种情况1.并列复合句中某些相同成分的省略2.在用when, while, if, as if, though, although, as ,until, whether等连词引导的状语从句中,如果谓语有be,而主语又跟主句的主语相同或是(从句主语是&am…

table 表体滚动, 表头、表尾固定

在开发报表中&#xff0c;如果报表数据行过多页面无法全部显示&#xff0c;或者内容溢出div&#xff0c;需要把表头和表尾固定表体滚动这样就可以在页面上全部显示&#xff0c;并且不会溢出div 效果&#xff1a;最终实现效果 代码&#xff1a;<!DOCTYPE html> <html&g…

Spring Security 中自定义权限表达式

Spring Security 中自定义权限表达式 一. SpEL中使用自定义Bean二. 通过类继承自定义权限表达式2.1 自定义 ExpressionRoot 三. 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在…

Thread

Thread 线程启动线程第一种创建线程线程的第二种创建方式使用匿名内部类完成线程的两种创建 Thread API线程的优先级线程提供的静态方法守护线程用户线程和守护线程的区别体现在进程结束时 多线并发安全问题同步块 线程 启动线程 启动线程:调用线程的start方法,而不是直接调用…

新版Idea显示Git提交人信息

新版Idea的类和方法上会展示开发者信息 不想展示的话可以做以下配置&#xff1a;

数据查找(search)-----散列表(哈希表)

目录 前言 一.散列表&#xff08;哈希表&#xff09;基本概念 二.哈希函数的构造 构造原则 构造方法 1.直接定址法 2.除留余数法 3.数字分析法 三.地址冲突 四.处理冲突的方法 开放定址法 1.线性探测法 2.二次探测法 3.伪随机探测法 链地址法 五.散列表的查找 前…

路由器如何设置IP地址

IP地址是计算机网络中的关键元素&#xff0c;用于标识和定位设备和主机。在家庭或办公室网络中&#xff0c;路由器起到了连接内部设备和外部互联网的关键作用。为了使网络正常运行&#xff0c;需要正确设置路由器的IP地址。本文将介绍如何设置路由器的IP地址&#xff0c;以确保…

P3983 赛斯石(赛后强化版),背包

题目背景 白露横江&#xff0c;水光接天&#xff0c;纵一苇之所如&#xff0c;凌万顷之茫然。——苏轼真程海洋近来需要进购大批赛斯石&#xff0c;你或许会问&#xff0c;什么是赛斯石&#xff1f; 首先我们来了解一下赛斯&#xff0c;赛斯是一个重量单位&#xff0c;我们用…

谷歌财报解读:基本盘守成有余,云业务进取不足?

科技巨头的AI之战持续上演&#xff0c;而财报季是一窥AI成色的重要窗口。 谷歌和微软这对在多个领域均正面对决的科技巨头&#xff0c;又在同一日发布了财报&#xff0c;而这次相比上季度&#xff0c;战局似乎迎来了反转。 上季度&#xff0c;谷歌不仅成功抵御了Bing联手ChatG…

从歌尔股份三季报中,读懂消费电子的“增程式”复苏

第三季度财报季前夕&#xff0c;消费电子板块可谓利好不断。 9月&#xff0c;苹果、华为纷纷发布新品&#xff0c;大厂高端机型带动购机热潮重现。同时&#xff0c;Meta推出的MR头显Quest3、智能眼镜Ray-Ban等XR新产品也备受消费者期待&#xff0c;大摩预测Quest 3今年出货量将…

面试150题做题记录

面试150题做题记录 题目1: 合并两个有序数组 题目1: 合并两个有序数组 题目&#xff1a;https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 最优思路&#xff1a;利用原有数列的单调性质&#xff0c;从右往左遍历&#xff…

驱动day10作业

基于platform驱动模型完成LED驱动的编写 驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/platform_device.h> #include<linux/mod_devicetable.h> #include<linux/of.h> #include<linux/of_gpio.h> #inclu…

本地部署 ChatGLM3

本地部署 ChatGLM3 ChatGLM3 介绍ChatGLM3 Github 地址部署 ChatGLM3运行综合 Demo对话模式工具模式代码解释器模式 API 部署 ChatGLM3 介绍 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型&#xff0c;在…