Python的错误和异常处理

一、错误和异常

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

(一)错误

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

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.mfbz.cn/a/111284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BI零售数据分析,告别拖延症,及时掌握一线信息

在日常的零售数据分析中,经常会因为数据量太大,分析指标太多且计算组合多变而导致数据分析报表难产,零售运营决策被迫拖延症。随着BI数据可视化分析技术的发展,智能化、可视化、自助分析的BI数据分析逐渐成熟,形成一套…

如何使用navicat图形化工具远程连接MariaDB数据库【cpolar内网穿透】

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Vue项目搭建及使用vue-cli创建项目、创建登录页面、与后台进行交互,以及安装和使用axios、qs和vue-axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css(css.txt) 2.3 配置路由 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…

【HMS Core】机器学习服务热门问题合集

【关键词】 机器学习服务、文本识别、身份证识别 【问题描述1】 机器学习服务的文本识别能力,是否支持草书等? 【解决方案】 草书是不支持的,目前建议使用较为规范的字体测试。 【问题描述2】 机器学习服务是否支持训练模型?…

Flink on yarn 加载失败plugins失效问题解决

Flink on yarn 加载失败plugins失效问题解决 flink版本:1.13.6 1. 问题 flink 任务运行在yarn集群,plugins加载失效,导致通过扩展资源获取任务参数失效 2. 问题定位 yarn容器的jar包及插件信息,jar包是正常上传 源码定位 加载plugins入口,TaskMana…

Mysql权限控制语句

1.创建用户 create user ky32localhost IDENTIFIED by 123456 create user:创建用户开头 ky32:用户名 localhost 新建的用户可以在哪些主机上登录 即可以使用ip地址,网段主机名 ky32localhost ky32192.168.233.22 ky32192.168.233.0/2…

如何在mac 安装 cocos 的 android环境

基本概念: Java: Java 是一种编程语言,由Sun Microsystems(现在是 Oracle Corporation)开发。Java 是一种跨平台的语言,可以用于开发各种应用程序,包括 Android 应用程序。Android 应用程序的核心代码通常用…

在 Visual Studio 中远程调试 C++ 项目

目录 一、说明二、下载远程工具1. 官网下载2. 自己电脑上拷贝 三、 运行远程工具四、本机Visual Studio配置五、自动部署 一、说明 参考官方文档:https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-cpp?viewvs-2022 二、下载远程工具 …

AutoX.js - openCV多分辨率找图

AutoX.js - openCV多分辨率找图 一、起因 AutoXjs 中有两个找图相关的方法 findImage 和 matchTemplate,之前一直没发现什么问题,但最近在一次测试找图时,明明大图和模板图的轮廓都清晰,却怎么也找不到图,降低阈值参…

vue-resource发送数据请求

vue-resource是Vue用于发送数据请求的一个插件库,在Vue1.0版本时使用比较频繁,现在Vue作者更支持使用axios进行数据发送。 一、安装vue-resource库 npm i vue-resource 二、使用vue-resource插件 使用插件之前需要先对插件进行引入 三、使用$http发送…

博弈论学习笔记(2)——完全信息静态博弈

前言 这部分我们学习的是完全信息静态博弈,主要内容包括博弈论的基本概念、战略式博弈、Nash均衡、Nash均衡解的特性、以及Nash均衡的应用。 零、绪论 1、什么是博弈论 1)博弈的定义 博弈论:研究决策主体的行为发生直接相互作用时候的决策…

前度开发面试题

面试题总结 vue页面跳转会经过两个钩子函数beforeEach、afterEach 组见守卫 beforeRouteEnter前置组见守卫 *beforeRouteUpdate更新之前 watch和computed区别 数据没有改变,则 computed 不会重新计算)。若没改变,计算属性会立即返回之前缓…

【Postgres】Postgres常用命令

文章目录 1、导出数据库某张表2、导入某张表到数据库3、查看数据库占用磁盘页数情况4、查看数据库大小5、查看数据表大小6、查看索引大小7、对数据库中表索引按照大小排序8、对数据库中表按照大小排序9、回收空间(建议先回收指定表)10、设置主键自增序列…

想做短视频,但是没有经验,不会拍、不会剪、不会写脚本怎么办?

现在很多人都准备进入短视频领域,让自己多一份收入。不过有个很现实的问题,不会拍、不会剪、也不会写脚本怎么办,还能做短视频吗? 如果是完全不会,那么初期肯定是要学习一些基础知识的,比如基础的拍摄技巧…

k8s从私有仓库拉取镜像

从私有仓库拉取镜像 | Kubernetes 准备开始 你必须拥有一个 Kubernetes 的集群,同时你必须配置 kubectl 命令行工具与你的集群通信。 建议在至少有两个不作为控制平面主机的节点的集群上运行本教程。可以通过 Minikube 构建一个你自己的集群,或者你可以…

二十二、Arcpy批量波段组合——结合Landat数据城市建成区提取

一、前言 其实波段组合和GIS中栅格计算有点类似,实质上就是对每个像素点对应的DN值进行数学计算,也就是可以进行运算表达式是三个或多个变量相加、相减……每一个变量对应于一个图像数据,对这三个或多个图像数据求值并输出结果图像。 二、具体操作 1、实验具体目标 将202…

英语——歌曲篇——only you

《only you》(只有你)赏析 很多人都听过The Platters(派特斯乐队)演唱的《only you》(只有你)这首歌曲,尤其是看过在周星驰和罗家英在《大话西游》里面演绎的"无厘头"版本后。 不过,又有几人知道,这首歌曲原来是经典浪漫影片《罗马…

【Docker】Linux网络命名空间

命名空间 Namespace是Linux提供的一种对于系统全局资源的隔离机制;从进程的视角来看,同一个namespace中的进程看到的是该namespace自己独立的一份全局资源,这些资源的变化只在本namespace中可见,对其他namespace没有影响。容器就…

python 练习 在列表元素中合适的位置插入 输入值

目的: 有一列从小到大排好的数字元素列表, 现在想往其插入一个值,要求: 大于右边数字小于左边数字 列表元素: [1,4,6,13,16,19,28,40,100] # 方法: 往列表中添加一个数值,其目的方便元素位置往后…
最新文章