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

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%免费

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

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

相关文章

什么是面向对象思想?

面向对象不是一种技术&#xff0c;而是一种思想。它指导我们以什么形式组织代码&#xff0c;以什么思路解决问题。 面向对象编程&#xff0c;是一种通过对象方式&#xff0c;把现实世界映射到计算机世界的编程方法。 面向对象解决问题的思路&#xff1a;把构成问题的事物分解成…

响应式导航栏不会做?看我一分钟学会制作导航栏!

引言 随着互联网技术的飞速发展&#xff0c;用户体验在网页设计中的重要性日益凸显。其中&#xff0c;导航栏作为网页的“指南针”&#xff0c;不仅能帮助用户快速定位所需内容&#xff0c;还能体现网站的整体风格和设计理念。本文将介绍如何使用HTML、CSS和JavaScript制作一个…

1.16 LeetCode总结(基本算法)动态规划2

70. 爬楼梯 首先想到的是递归&#xff1a; // 递归 int climbStairs(int n) {if (n 1) {return 1;} else if (n 2) {return 2;}return climbStairs(n - 1) climbStairs(n - 2); }我们先来看看这个递归的时间复杂度吧&#xff1a; 递归时间复杂度 解决一个子问题时间*子问…

【翻译】再见, Clean Code!

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 【翻译】再见, Clean Code!正文那是一个深夜次日早晨这只是一个阶段 【翻译】再见…

【植物大战僵尸融合机器学习】+源码

上期回顾&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是植物大战僵尸。 《植物大战僵尸》是一款极富策略性的小游戏。可怕的僵尸即将入侵&#xff0c;每种僵尸都有不同的特点&#xff0c;例如铁桶僵尸拥有极强的抗…

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

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

Java-博客系统(前后端交互)

目录 前言 博客系统基本情况 1 创建项目&#xff0c;引入依赖 2 数据库设计 2.1 分析 2.2 建库建表 3 封装数据库 3.1 在java目录下创建DBUtil类&#xff0c;通过这个类对数据库进行封装 3.2 在java目录下创建实体类&#xff08;博客类Blog&#xff09; 3.2 在java目录下创建…

vwmare+Ubuntu20.04安装超级保姆级完整教程

强烈建议先完整的看完一遍教程在进行安装以免出现问题&#xff01;&#xff01;&#xff01; 如果遇到error&#xff1a;建议复制error后面的信息然后到浏览器搜索&#xff0c;查找解决方案&#xff0c;其次在进行某个不确定的操作时&#xff0c;建议先保存快照&#xff0c;这样…

uboot操作指令1

文章目录 前言一、信息查询命令1.bdinfo用于查看板子的信息2.printenv 打印环境变量3.version查看uboot版本 二、环境变量操作命令1.setenv修改环境变量2.setenv新建环境变量3.setenv删除环境变量 三、内存操作命令1.md 命令2.nm命令3.mm命令4.mw命令 四、网络操作命令1.ping命…

Zookeeper与kafka

目录 一、zookeeper 1.1.zookeeper概述 1.2.Zookeeper 工作机制 1.3. Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 选举机制 第一次启动选举机制 非第一次启动选举机制 选举Leader规则&#xff1a; 1.7.部署 Zookeeper 集群 1.7.…

AI人工智能讲师大模型培训讲师叶梓 大语言模型(LLM)在科学文献摘要领域的应用

大语言模型&#xff08;LLM&#xff09;在科学文献摘要领域的应用是一个前沿且迅速发展的技术趋势。通过结合GitHub上yobibyte的Compressor项目&#xff0c;我们可以深入探讨这一技术方案的潜力和实现方式。 技术背景 随着科学研究的快速发展&#xff0c;每天都有大量的科学文…

matlab学习(三)(4.9-4.15)

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

服务器数据恢复—ext3文件系统下raid5数据恢复案例

服务器数据恢复环境&故障情况&#xff1a; 某企业光纤存储上有一组由16块硬盘组建的raid5阵列。管理员发现该光纤存储上的卷无法挂载&#xff0c;经过检查发现raid5阵列中有2块硬盘离线&#xff0c;于是联系我们数据恢复中心要求数据恢复工程师到现场恢复服务器存储上的数据…

【可能是全网最丝滑的LangChain教程】七、LCEL表达式语言

系列文章地址 【可能是全网最丝滑的LangChain教程】一、LangChain介绍-CSDN博客 【可能是全网最丝滑的LangChain教程】二、LangChain安装-CSDN博客 【可能是全网最丝滑的LangChain教程】三、快速入门LLM Chain-CSDN博客 【可能是全网最丝滑的LangChain教程】四、快速入门Re…

在js中计算两个时间段重叠的时长问题

文章目录 前言一、过程分析二、实现代码(js)总结 前言 最近遇到一个需求&#xff0c;就是在js中计算两段时间的重叠时长问题&#xff0c;这里记录一下。 一、过程分析 两段时间的重叠问题&#xff0c;一般有3中情况 两段时间完全无重叠&#xff0c;也就是无任何交集两段时间…

软考中级--网络工程师-计算机基础与理论第二节无线基础知识

IEEE802.11 规定了多种 WLAN 通信标准&#xff0c;其中&#xff08; &#xff09;与其他标准采用的频段不同&#xff0c;因而不能兼容。 A IEEE802.11a B IEEE802.11b C IEEE802.11g D IEEE802.11n 试题答案 正确答案&#xff1a; A 答案解析 IEEE 802.11a规定采用5GHz的 ISM频…

007Node.js安装自启动工具supervisor运行js文件

在vscode中&#xff0c;某些运行中的程序修改xx.js文件后&#xff0c;通过CtrlC终止再重新运行。supervisor是自启动工具&#xff0c;会不停的查看你的文件&#xff0c;一旦发现有修改&#xff0c;就立马重新载入运行。 我们可以通过安装supervisor代替node命令运行xx.js。终端…

环境变量与进程优先级

目录 进程的优先级 什么是优先级 为什么要有优先级 linux的优先级特点和查看方式 其他概念 环境变量 命令行参数 环境变量 查看环境变量方法 修改PATH 其他环境变量 进程的优先级 什么是优先级 优先级&#xff1a;指定进程获得某种资源的先后顺序。&#xff08;优先级…

Python数据分析案例40——电商直播间成交金额预测

承接上一篇案例电商直播间提取的特征&#xff0c;进而做一篇机器学习的案例&#xff0c;来预测直播间的成交金额。 Python数据分析案例39——电商直播间评论可视化分析&#xff08;LDA&#xff09; 1. 引言 1.1 直播电商与传统电商的比较 直播电商作为一种新兴的电子商务模式…

c语言中<string.h>的strstr与strtok函数

c语言中string.h的strstr与strtok函数 代码运行结果 代码 #include <stdio.h> #include <string.h>///1.在字符串str1里面,查找第一次出现str2的位置 //char * strstr(const char * str1,const char * str2)///2.sep为分割符,根据分割符来对str进行分割 //char * …