Python入门(二十四)异常(一)

news/2024/11/15 2:56:47/

异常(一)

  • 1.概述
  • 2.处理ZeroDivisionError异常
  • 3.使用try-except代码块
  • 4.使用异常避免崩溃

1.概述

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

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

2.处理ZeroDivisionError异常

下面来看一种导致Python引发异常的简单错误。你可能知道,不能用数除以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,发生这种错误时怎么办。这样,如果再次发生此类错误,我们就有备无患了。

3.使用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't divide by zero!

如果try-except代码块后面还有其他代码,程序将接着运行,因为已经告诉了Python如何处理这种错误。下面来看一个捕获错误后程序继续运行的示例。

4.使用异常避免崩溃

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

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

  print("Give me two numbers, and I'll divide them.")print("Enter 'q' to quit.")while True:
❶     first_number = input("\nFirst 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。如果用户输入的不是表示退出的q,就再提示用户输入一个数,并将其赋给变量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 9, in <module>answer = int(first_number) / int(second_number)
ZeroDivisionError: division by zero

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


http://www.ppmy.cn/news/450714.html

相关文章

Comet OJ - Contest #10 C.鱼跃龙门

传送门 题意&#xff1a; 求最小的\(x\)&#xff0c;满足\(\frac{x(x1)}{2}\% n0,n\leq 10^{12}\)。 多组数据&#xff0c;\(T\leq 100\)。 思路&#xff1a; 直接考虑模运算似乎涉及到二次剩余什么的&#xff0c;但比较复杂。注意到比较特殊的就是&#xff0c;最后结果为\(0\)…

power的数据库设计MySQL_使用 PowerDesigner 设计数据库 - ~~鱼跃~~ - 博客园

数据库的结构(例如表、关系、视图和触发器)称为数据库模式。可使用 SQL 语句创建这些元素并按照所需的方式进行排列&#xff0c;但是如果不使用图形工具&#xff0c;则可能会造成混淆。 PowerDesigner 提供了一种数据库结构的图形表示。只需绘制新表或输入信息&#xff0c;即可…

业绩突出的鱼跃医疗:研发费用占比较低,财报发布后大跌接近4%

10月22日&#xff0c;鱼跃医疗&#xff08;SZ:002223&#xff09;披露2020年第三季度财报。财报显示&#xff0c;该公司2020年前三季度营收48.48亿元&#xff0c;同比增长36.33%&#xff1b;净利润15.1亿元&#xff0c;同比增长111.84%。 根据财报&#xff0c;鱼跃医疗预计其2…

Comet OJ - Contest #10鱼跃龙门

题目来源&#xff1a;https://www.cometoj.com/contest/65/problem/C?problem_id3684 题意&#xff1a;求k*(k1)/2%n0的最小k。 由k与k1可以想到设置未知数&#xff1a;k1px,kqy,可列得方程&#xff1a;px-qy1&#xff0c;由此扩展欧几里得方程&#xff0c; 原方程为px*qy/…

CometOJ-[Contest #10]鱼跃龙门【exgcd】

正题 题目链接:https://cometoj.com/problem/1479 题目大意 给出 n n n求一个最小的 x ( x > 0 ) x(x>0) x(x>0)满足 ( ∑ i 1 x i ) ≡ 0 ( m o d n ) \left(\sum_{i1}^xi\right)\equiv 0(\mod n) (i1∑x​i)≡0(modn) 1 ≤ n ≤ 1 0 12 , 1 ≤ T ≤ 100 1\leq n…

【gmoj】 【扩欧】 鱼跃龙门

【gmoj】 【扩欧】 鱼跃龙门 题目 解题思路 题意 就是求1~x的和能整除n 高斯求和公式是x&#xff08;x1&#xff09;/2 也就是说x&#xff08;x1&#xff09;/2n 移项x(x1)2n 设apx1&#xff0c;bqx ap-bqgcd(a,b) 要求出最小的bq&#xff08;x&#xff09; 已知b&#xff0…

JDK 内置图形界面工具:海阔凭鱼跃,天高任鸟飞

GUI 图形界面工具,主要是 3 款:JConsole、JVisualVM、JMC。其实这三个产品可以说是 3 代不同的 JVM 分析工具。 这三个工具都支持我们分析本地 JVM 进程,或者通过 JMX 等方式连接到远程 JVM 进程。当然,图形界面工具的版本号和目标 JVM 不能差别太大,否则可能会报错。 下…

【毕业季】致毕业生的一句话:天高任鸟飞,海阔凭鱼跃

活动地址&#xff1a;毕业季进击的技术er 各位小伙伴们大家好&#xff0c;我是小曾哥&#xff0c;今天文章的主题没有技术干货&#xff0c;只有一个在校生的故事。 欢迎大家在评论区说出自己的故事&#xff0c;我先给大家抛个砖&#xff0c;希望能够引出大家的故事&#xff01;…