你真的会处理python代码异常吗?

news2024/11/21 1:29:11

Python 使用称为异常(exception)的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback,其中包含有关异常的报告。

异常是使用 try-except 代码块处理的。try-except 代码块让 Python 执行指定的操作,同时告诉 Pysthon 在发生异常时应该怎么办。在使用 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback。

处理 ZeroDivisionError 异常

下面来看一种导致 Pyton 引发异常的简单错误。你可能知道不能将数除以人 0,但还是让Python试试看吧:

print(5/0)

Python 无法这样做,因此你将看到一个 traceback:

Traceback (most recent call last):
File "division calculator.py", line 1, in <module> 
     print(5/0)
           ~^~
①ZeroDivisionError: division by zero

在上述traceback 中,错误 ZeroDivisionError 是个异常对象(见①)。Python 在无法按你的要求做时,就会创建这种对象。在这种情况下,Python 将停止运行程序,并指出引发了哪种异常,而我们可根据这些信息对程序进行修改。下面将告诉Python,在发生这种错误时该怎么办。这样,如果再次发生这样的错误,我们就有所准备了。

使用 try-except 代码块

当你认为可能发生错误时,可编写一个 try-except 代码块来处理可能引发的异常。你让 Python 尝试运行特定的代码,并告诉它如果这些代码引发了指定的异常,该怎么办。

处理 zeroDivisionError 异常的 try-except 代码块类似于下面这样:

try:
  print(5/0)
except ZeroDivisionError:
  print("You can't divide by zero!")

这里将导致错误的代码行 print(5/0)放在一个try 代码块中。如果 try代码块中的代码运行起来没有问题,Python 将跳过 except 代码块;如果 try 代码块中的代码导致错误,Python将查找与之匹配的 except 代码块并运行其中的代码。

在这个示例中,try 代码块中的代码引发了 ZeroDivisionError 异常,因此 Python 查找指出了该怎么办的 except 代码块,并运行其中的代码。这样,用户看到的是一条友好的错误消息,而不是 traceback:

You can'+ divide by zero!

如果 try-except 代码块后面还有其他代码,程序将继线运行,因为Python已经知道了如何处理错误。下面來看一个在捕获错误后让程序继续运行的示例。

使用异常避免崩溃

如果在错误发生时,程序还有工作没有完成,妥善地处理错误就显得尤其重要。这种情况经當出现在要求用户提供输人的程序中。如果程序能够妥善地处理无效输人,就能提不用户提供有效输人,而不至于崩溃。

下面来创建一个只执行除法运算的简单计算器:

print("Give me two numbers, and I'll divide them.")
print("Enter 'g' to quit.")
while True:
①    first number = input ("First_number: ")
      if first number == 'q':
         break
②    second_number = input("Second_number: ")
      if second number == 'q':
         break
③    answer = int(first_number) / int(second_number)
      print(answer)

在①处,程序提示用户输人一个数,并将其赋给变量 first_number。如果用户输人的不是表示退出的9,就再提示用户输人一个数,并将其赋给变量 second_ number(见②)。接下来,计算这两个数的商(见③)。这个程序没有采取任何处理错误的措施,因此在执行除数为 0 的除法运算时,它将崩溃:

Give me two numbers, and I'll divide them.
Enter 'q' to quit.

First number: 5
Second number: 0
Traceback (most recent call last):
 File "division_calculator.py", line 11, in <module>
   answer = int (first number) / int(second number)
         ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~
ZeroDivisionError: division by zero

程序崩溃可不好,让用户看到 traceback 也不是个好主意。不懂技术的用户会感到糊涂,怀有恶意的用户还能通过 traceback 获悉你不想让他们知道的信息。例如,他们将知道你的程序文件的名称,还将看到部分不能正确运行的代码。有时候,训练有素的攻击者可根据这些信息判断出可对你的代码发起什么样的攻击。

else 代码块

通过将可能引发错误的代码放在 try-except 代码块中,可提高程序抵御错误的能力。因为错误是执行除法运算的代码行导致的,所以需要将它放到 try-except 代码块中。这个示例还包含一个else 代码块,只有try代码块成功执行才需要继续执行的代码,都应放到else代码块中:

--snip--
while True:
  --Ship--
  if second number == 'g':
    breaktry:
    answer = in(first _number) / int (second _number)except ZeroDivisionError:
    print("You can't divide by 0!")else:
    print(answer)

我们让Python 尝试执行 try代码块中的除法运算(见①),这个代码块只包含可能导致错误的代码。依赖 try 代码块成功执行的代码都被放在else 代码块中。在这个示例中,如果除法运算成功,就使用else 代码块来打印结果(见③)。

except 代码块告诉 Python,在出现 zeroDivisionError 异常时该怎么办(见②)。如果try代码块因零除错误而失败,就打印一条友好的消息,告诉用户如何避免这种错误。程序会继续运行,而用户根本看不到 traceback:

Give me two numbers, and I'll divide them.
Enter 'q' to quit.

First number: 5
Second number: O
You can't divide by 0!
First number: 5
Second number: 2
2.5
First number: q

只有可能引发异常的代码才需要放在try 语向中。有时候,有一些仅在try 代码块成功执行时才需要运行的代码,这些代码应放在else 代码块中。except 代码块告诉 Python,如果在尝试运行 try代码块中的代码时引发了指定的异常该怎么办。

通过预测可能发生错误的代码,可编与稳健的程序。它们即便面临无效数据或缺少资源,也能继续运行,不受无意的用户错误和恶意攻击的影响。

静默失败

在上一个示例中,我们告诉用户有一个文件找不到。但并非每次捕获异常都需要告诉用户,从有时候希望程序在发生异常时保持静默,就像什么都没有发生一样继续运行。要让程序静默失败,可像通常那样编写 try 代码块,但在except 代码块中明确地告诉Python什么都不要做。

Python有一个pass 语句,可在代码块中使用它来让Python什么都不做:

def count words (path)"""计算一个文件大致包含多少个单词"""
    try:
      ~~ship~~
    except FileNotFoundError:
      pass 
    else:
      ~~snip~~

相比于上一个程序,这个程序唯一的不同之处是,except 代码块包含一条pass语句。现在,当出现 FileNotFoundError 异常时,虽然仍将执行 except 代码块中的代码,但什么都不会发生。当这种错误发生时,既不会出现 traceback,也没有任何输出。用户将看到存在的每个文件包含多少个单词,但没有任何迹象表明有一个文件未找到:

The file alice.txt has about 29594 words .
The file moby dick. txt has about 215864 words .
The file little women.txt has about 189142 words.

pass 语向还充当了 占位符,提醒你在程序的某个地方什么都没有做,而且以后地许要在这型水世什么。例如,在这个程序中,我们可能决定特找不到的文件的台称写人文什missing_fles.txt。虽然用户看不到这个文件,但我们可以读取它。进而处理所有找不到文件的回题。

决定报告哪些错误

该在什么情况下向用户报告错误?又该在什么情况下静默失败呢?如果用户知道要分析哪些文件,他们可能希望在有文件未被分析时出现一条消息来告知原因。如果用广只想看到结果,并不知道要分析哪些文件,可能就无须在有些文件不存在时告知他们。向用户显示他们不想看到的信息可能会降低程序的可用性。Python 的错误处理结构让你能够细致地控制与用户共享错误信息的程度,要共享多少信息由你决定。

编写得很好且经过恰当测试的代码不容易出现内部错误,如语法错误和逻辑错误,但只要程序依赖于外部因素,如用户输人、是否存在指定的文件、是否有网络连接,就有可能出现异器。凭借经验可判断该在程序的什么地方包含昇常处理块,以及出现错误时该向用户提供多少相关的信息。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

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

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

相关文章

CodeGemma: Open Code Models Based on Gemma

最近几天&#xff0c;对大模型生成代码的能力比较感兴趣&#xff0c;特此学习了一下大模型怎么在IDE上进行&#xff0c;自动补全你想要的代码。 大模型源码理解-以Gemma为例子 最近也在使用阿里的通义灵码&#xff0c;感觉还挺好用的。通义灵码 摘要&#xff1a; CodeGemma基…

Linux ARM平台开发系列讲解(QEMU篇) 1.2 新添加一个Linux kernel设备树

1. 概述 上一章节我们利用QEMU成功启动了Linux kernel,但是细心的小伙伴就会发现,我们用默认的defconfig是没有找到设备树源文件的,但是又发现kernel启动时候它使用了设备树riscv-virtio,qemu,这是因为qemu用了一个默认的设备树文件,该章节呢我们就把这个默认的设备树文件…

【设计模式学习】单例模式和工厂模式

꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转…

明月三千里许红:25年磨一剑 拒绝网红式短期主义

这是一个关于明月三千里烤肉品牌如何在25年企业经营风口浪尖中&#xff0c;寻求长久生存和发展的故事&#xff1b;也是一个关于明月三千里烤肉品牌如何在25年中追逐流量的同时&#xff0c;不失去初心和品质的深度思考&#xff01; 在当今快速变化的餐饮市场中&#xff0c;淄博烤…

【CSS】利用Vue实现数字翻滚动画效果

利用Vue实现数字翻滚动画效果 在很多数据可视化的需求中&#xff0c;动态呈现数据变化是一个常见且具有较强视觉冲击力的手段&#xff0c;尤其是数字的实时变化。今天我们将探讨如何使用 Vue.js 和 CSS3 来实现数字的翻滚动画效果&#xff0c;即模拟真实物体在Z轴上翻动的效果…

使用cmake进行打包,包含可执行程序和动态依赖库

平常代码开发中&#xff0c;有时候需要将写的程序打包成压缩包放到目标设备上进行运行测试。用CMake管理工程&#xff0c;实现使用make -jnproc package指令可以将工程进行打包&#xff0c;可执行文件存储在bin文件夹中&#xff0c;依赖库存储在lib文件夹中。 示例 1.工程目录结…

选择自动化工具是一个关键的决策过程

好的自动化软件测试工具&#xff0c;不仅可以有效的缩短全生命周期的交付周期&#xff0c;还可以提高测试的有效性&#xff0c;还可以保证更好的高质量的交付。工具的选型是一项重要的决策过程&#xff0c;工具的采用涉及到企业的效率、成本和长期发展。 1、需求分析 确组织希…

云服务器web环境之mariadb

1.安装mariadb服务 yum install mariadb-server 启动mariadb服务 systemctl start mariadb.service 输入mysql就能使用数据库了。 2.服务相关操作 systemctl stop mariadb.service systemctl restart mariadb.service 2.配置开机自启动 systemctl enable mariadb.serv…

python--5--len()

学习目标&#xff1a; len()#range&#xff0c;list,列表、元组,字符串,包括空格,返回字典的“键值对”个数 学习内容&#xff1a; len()#range&#xff0c;list,列表、元组,字符串,包括空格,返回字典的“键值对”个数 len()--返回对象长度 len()#range&#xff0c;list,列…

matlab学习(三)(4.9-4.15)

一、空域里LSB算法的原理 1.原理&#xff1a; LSB算法通过替换图像像素的最低位来嵌入信息。这些被替换的LSB序列可以是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。 2.实现步骤&#xff1a; &#xff08;1&#xff09;将图像文件中的所有像素点以RGB形…

华为海思数字芯片设计笔试第四套

声明 下面的题目作答都是自己认为正确的答案&#xff0c;并非官方答案&#xff0c;如果有不同的意见&#xff0c;可以评论区交流。 这些题目也是笔者从各个地方收集的&#xff0c;感觉有些题目答案并不正确&#xff0c;所以在个别题目会给出自己的见解&#xff0c;欢迎大家讨论…

1688采集API 接口:轻松实现电商数据采集与官方订单API接口对接

各大平台电商软件大全&#xff0c;优质服务 1688采集API接口&#xff0c;一款助力电商从业者轻松实现阿里巴巴与1688平台商品数据采集接口&#xff0c;在数据为王的电商时代&#xff0c;掌握高效的采集与管理技能&#xff0c;无疑是成功的一把钥匙。 功能概述&#xff1a; 1.…

神经射频脉冲术,破解疼痛之锁

一位十余年糖尿病病史的患者&#xff0c;右足开始出现疼痛和麻木的症状三个多月&#xff0c;给他的生活带来了极大的困扰。他曾在多家医院就诊&#xff0c;但治疗效果并不理想。直到他走进了北京精诚博爱医院&#xff0c;这里为他带来了希望和转机。 经过详细的检查&#xff0c…

分享一款免费阅读的软件:Legado,已免费开源(文末有福利)

对于喜欢阅读的人来说&#xff0c;一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代&#xff0c;再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题&#xff1a;比如广告弹窗太多&#xff0c;排版乱&#xff0c;甚至很多的APP都进入会员时代&#xff0c;再加上一…

使用odbc链接dm8数据库

一、环境说明 windows11 VMware Workstation 17 Pro ubuntu22.04 docker $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy因docker版本的dm8中&#xff0c;没有…

操作系统(Operating System)专题篇——同步与互斥1

目录 0.前言 1.同步与互斥问题总览 2.生产者-消费者问题 2.1 单生产者-单消费者-多资源 2.2 多生产者-多消费者-单资源 2.3 吸烟者问题(单生产者-多消费者-单资源) 2.4 和尚打水问题(多生产者-多消费者-多资源) 3.读写者问题 3.1 读者优先 3.2 写者优先 3.3 过桥问题…

【SpringBoot:详解Bean装配】

&#x1f3e1;Java码农探花&#xff1a; &#x1f525; 推荐专栏&#xff1a;<springboot学习> &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、IoC容器的简介BeanFactory接口源码二、Bean装配扫描装配探索启动类条件装配自定义Bean总…

springboot 人大金仓 kingbase-备份还原,命令中带密码

命令带密码参考 Java代码实现国产人大金仓数据库备份还原需求-CSDN博客文章浏览阅读818次&#xff0c;点赞16次&#xff0c;收藏12次。本人在一次项目中&#xff0c;遇到了需要在系统管理中提供给用户备份还原系统数据的功能&#xff0c;由于项目特殊性&#xff0c;项目底层数…

如何使用电商接口获取商品信息,价格,主图?

1、什么是电商接口&#xff1f; 电商接口是指用于实现电商平台与其他系统之间进行数据交互和功能调的一组规范和方法。通过电商接口&#xff0c;可以实现商品信息的获取、订单管理、支付处理、物流跟踪等功能。 常见的电商接口包括&#xff1a; 商品接口&#xff1a;用于获取…

BLDC的机械角度、电角度与换相时间

6步换相梯形控制&#xff0c;6步一个周期定义为电角度360 总电角度 极对数 * 机械角度 机械角度是指360&#xff0c;一个圆周角&#xff1b; 电角度度指转子转动的角度&#xff0c;从一个N极到下一个N极是360。从N极只到 S极&#xff0c;则转子只运行了180。由于一个电机中通…