Python3 错误和异常实例及演示

news2024/12/27 3:59:14

作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍。

Python 有2种错误很容易辨认:语法错误和异常。

Python assert(断言)用于判断1个表达式,在表达式条件为 false 的时候触发异常。

 

语法错误

Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下:

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

1这个例子中,函数 print() 被检查到有错误,是它前面缺少了1个冒号 : 。

语法分析器指出了出错的1行,并且在最先找到的错误的位置标记了1个小小的箭头。

异常

即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

实例:

>>> 10 * (1/0)             # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3             # spam 未定义,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2               # int 不能与 str 相加,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息。

异常处理

try/except

异常捕捉可以使用 try/except 语句。

 

以下例子中,让用户输入1个合法的整数,但是允许用户中断这个程序(使用 Control-C 或者操作系统提供的方法)。用户中断的信息会引发1个 KeyboardInterrupt 异常。

while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")

try 语句按照如下方式工作;

1:首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。

2:如果没有异常发生,忽略 except 子句,try 子句执行后结束。

3:如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

4:如果1个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

1个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有1个分支会被执行。

处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

1个except子句可以同时处理多个异常,这些异常将被放在1个括号里成为1个元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

最后1个except子句可以忽略异常的名称,它将被当作通配符使用。可以使用这种方法打印1个错误信息,然后再次把异常抛出。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

try/except...else

try/except 语句还有1个可选的 else 子句,如果使用这个子句,那么必须放在所有的 except 子句之后。

else 子句将在 try 子句没有发生任何异常的时候执行。

 

以下实例在 try 语句中判断文件是否可以打开,如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()

使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

异常处理并不仅仅处理那些直接发生在 try 子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常。例如:

>>> def this_fails():
        x = 1/0
   
>>> try:
        this_fails()
    except ZeroDivisionError as err:
        print('Handling run-time error:', err)
   
Handling run-time error: int division or modulo by zero

try-finally 语句

try-finally 语句无论是否发生异常都将执行最后的代码。

 

以下实例中 finally 语句无论异常是否发生都会执行:

实例:

try:
    runoob()
except AssertionError as error:
    print(error)
else:
    try:
        with open('file.log') as file:
            read_data = file.read()
    except FileNotFoundError as fnf_error:
        print(fnf_error)
finally:
    print('这句话,无论异常是否发生都会执行。')

抛出异常

Python 使用 raise 语句抛出1个指定的异常。

raise语法格式如下:

raise [Exception [, args [, traceback]]]

 

以下实例如果 x 大于 5 就触发异常:

x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

执行以上代码会触发异常:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10

raise 唯一的1个参数指定了要被抛出的异常。它必须是1个异常的实例或者是异常的类(也就是 Exception 的子类)。

如果只想知道这是否抛出了1个异常,并不想去处理它,那么1个简单的 raise 语句就可以再次把它抛出。

>>> try:
        raise NameError('HiThere')  # 模拟一个异常。
    except NameError:
        print('An exception flew by!')
        raise
   
An exception flew by!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
NameError: HiThere

用户自定义异常

可以通过创建1个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承,例如:

>>> class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
   
>>> try:
        raise MyError(2*2)
    except MyError as e:
        print('My exception occurred, value:', e.value)
   
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

在这个例子中,类 Exception 默认的 __init__() 被覆盖。

当创建1个模块有可能抛出多种不同的异常时,1种通常的做法是为这个包建立1个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。

定义清理行为

try 语句还有另外1个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

以上例子不管 try 子句里面有没有发生异常,finally 子句都会执行。

如果1个异常在 try 子句里(或者在 except 和 else 子句里)被抛出,而又没有任何的 except 把它截住,那么这个异常会在 finally 子句执行后被抛出。

下面是1个更加复杂的例子(在同1个 try 语句里包含 except 和 finally 子句):

>>> def divide(x, y):
        try:
            result = x / y
        except ZeroDivisionError:
            print("division by zero!")
        else:
            print("result is", result)
        finally:
            print("executing finally clause")
   
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'

预定义的清理行为

一些对象定义了标准的清理行为,无论系统是否成功的使用了它,一旦不需要它了,那么这个标准的清理行为就会执行。

下面这个例子展示了尝试打开1个文件,然后把内容打印到屏幕上:

for line in open("myfile.txt"):
    print(line, end="")

以上这段代码的问题是,当执行完毕后,文件会保持打开状态,并没有被关闭。

关键词 with 语句就可以保证诸如文件之类的对象在使用完之后一定会正确的执行他的清理方法:

with open("myfile.txt") as f:
    for line in f:
        print(line, end="")

以上这段代码执行完毕后,就算在处理过程中出问题了,文件 f 总是会关闭。

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

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

相关文章

通信算法之一百零四:QPSK完整收发仿真链路

1.发射机物理层基带仿真链路 1.1 % Generates the data to be transmitted [transmittedBin, ~] BitGenerator(); 2.2 % Modulates the bits into QPSK symbols modulatedData QPSKModulator(transmittedBin); 2.3 % Square root Raised Cosine Transmit Filter %comm…

SpringBoot参数请求处理

一、请求映射 请求映射原理 DispatcherServlet 继承了 FrameworkServlet(抽象类&#xff0c;继承了 HttpServletBean&#xff0c;实现了 ApplicationContextAware 接口)&#xff0c;重写了 doService() 方法 在 doService() 方法里定义了 doDispatch() 方法&#xff1b;doDi…

概论_第7章_参数估计_真题__求置信区间

真题 2014.10 第30题 测量某物体的质量9次&#xff0c; 测得平均值 x‾15.4\overline x 15.4x15.4 g, 已知测量数据 XXX ~ N(μ,0.09)N(\mu, 0.09)N(μ,0.09) (1) 求该物体质量的置信度为0.95 的置信区间&#xff1b; &#xff08;2&#xff09;为了使置信度为0.95 的置信区间…

20 堆排序

文章目录1 堆排序的概念2 堆排序基本思想3 堆排序步骤图解说明4 堆排序的代码实现1 堆排序的概念 1) 堆排序是利用堆这种数据结构而设计的一种排序算法&#xff0c;堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为 O(nlogn)&#xf…

Spring中BeanPostProcessor与循环依赖的问题

Spring中后置处理器与循环依赖的问题 在Spring的bean生命周期中, 我们可以通过实现BeanPostProcessor来对bean初始化前后做操作, 在网上的许多帖子博客中, 不乏可以看见说Spring的AOP是在后置处理器中实现的, 这个理解显然有失偏颇, 很容易误导一般人在后置处理器中对原先的be…

Android 一帧绘制流程分析笔记

和你一起终身学习&#xff0c;这里是程序员Android经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点:一、显示一帧流程概览二、生产者&#xff0c;消费者 BufferQueue 流转图三、App &#xff0c;SF Buffer 交互图四、SF 跟 HWC 交互图一、显示一帧流程概览…

16.CSS中使用颜色

使用颜色 在计算机中&#xff0c;传统的模型之一为RGB模型&#xff0c;所有颜色都是通过红色、蓝色、绿色三种颜色进行组合&#xff1b;我们通过数值去表示 例如&#xff1a; 红色&#xff08;255.0.0&#xff09;、蓝色&#xff08;0.0.255&#xff09;、绿色&#xff08;0.…

在IDEA中配置jeesite-(文章链接汇总)

建议按照文章顺序操作 原文里可以下载geesite项目 jeesite-github原文链接 jeesite-gitee原文链接–国内推荐 可 直 接 跳 到 此 步 骤 环境准备&#xff1a;JDK 1.8 or 11、17、Maven 3.6、使用 MySQL 5.7 or 8.0 数据库 1-Maven的下载安装配置教程&#xff08;详细图文&am…

Vue3之循环渲染

1.何为循环渲染 在Vue3中&#xff0c;当我们需要渲染一个数组中的数据到dom元素上时&#xff0c;就需要使用循环渲染。循环渲染可以节约我们大量重复冗余的工作&#xff0c;比如我们去渲染一个下拉菜单的时候&#xff0c;如果不使用循环渲染&#xff0c;那么我们需要手动一项一…

2023美赛C代码思路结果【全部更新完毕】注释详尽

C题已完成全部代码&#xff0c;注释详尽&#xff0c;并增加扰动项&#xff0c;保证大家的结果不会撞 需要全部问题的可以点击&#xff1a;https://www.jdmm.cc/file/2708697/ 下面贴出核心代码&#xff1a; -- coding: utf-8 -- TODO: 入口函数 import numpy as np from…

Mr. Cappuccino的第43杯咖啡——Kubernetes之Pod控制器(二)

Kubernetes之Pod控制器Horizontal Pod Autoscaler&#xff08;HPA&#xff09;安装metrics-server创建Pod创建HPA压力测试JobCronJobHorizontal Pod Autoscaler&#xff08;HPA&#xff09; 上篇文章中所说的ReplicaSet和Deployment&#xff0c;我们已经可以通过手动执行kubec…

Shiro1.9学习笔记

文章目录一、Shiro概述1、Shiro简介1.1 介绍1.2 Shiro特点2、Shiro与SpringSecurity的对比3、Shiro基本功能4、Shiro原理4.1 Shiro 架构(外部)4.2 shiro架构(内部)二、Shiro基本使用1、环境准备2、登录认证2.1 登录认证概念2.2 登录认证基本流程2.3 登录认证实例2.4 身份认证源…

WordPress网站伪静态及固定链接设置教程

WordPress网站伪静态及固定链接设置教程-解决404错误问题!搭建好WordPress网站之后我个人建议首先要做的就是设置好固定链接&#xff0c;WordPress的固定链接也就是网站各个页面的链接格式&#xff0c;默认的方式不太符合现代化网站&#xff0c;推荐使用自定义的方案。既然涉及…

良许翻天覆地的2022年

大家好&#xff0c;我是良许&#xff0c;新年快乐呀~ 在我女室友坚持不懈的努力之下&#xff0c;2022年的最后一天我终于被她传染了&#xff0c;阳了~ 此时的我&#xff0c;正顶着37多度的低烧写下这篇年终总结。 2022年&#xff0c;对于大多数人而言&#xff0c;封控是主旋…

Git使用小乌龟克隆与推送代码Gitee--零命令行(组员版本)

目录 上一篇文章&#xff08;必读&#xff01;&#xff01;&#xff01;&#xff09; 概述 分支概念&#xff08;权限分配&#xff09;&#xff1a; 总体操作思想&#xff1a; 操作步骤 一、组员第一天上班&#xff08;云端仓库代码克隆到本地仓库进行代码编写&#xff…

网日志处理中的应用架构-《大数据时代的IT架构设计》

用户的上网行为中蕴含着大量的客户特征和客户需求信息&#xff0c;这些信息至关重要,这就要求用户的上网日志记录必须被保存&#xff0c;而且还需要进行数据分析挖掘处理&#xff0c;然后根据处理结果定义用户的行为习惯&#xff0c;为电信运营商实现精细化运营提供重要的营销依…

【数据库】Clickhouse 实践之路

文章目录背景Clickhouse简介为什么选择ClickhouseClickhouse特性Clickhouse建设整体架构数据接入层数据存储层数据服务层数据应用层Clickhouse运维管理平台配置文件结构元数据管理自动化运维用户管理集群操作监控与报警Clickhouse应用BI查询引擎核心诉求选型对比集群构建问题及…

基于jeecgboot的flowable流程设计器的几个bug修复

因为今天在用任务监听器的时候&#xff0c;出现几个bug&#xff0c;所以一并修复与处理。 一、建立任务监听器后&#xff0c;删除不了 主要有两个原因&#xff0c;一个是点击删除没反应&#xff0c;实际上是弹出框跑到后面去了&#xff0c;说明还是z-index问题&#xff0c;调整…

.Net Core中使用NEST简单操作Elasticsearch

C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net&#xff0c;NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作&#xff0c;而Elasticsearch.Net相比之下更为原始直接非常自由。注意&#xff1a;ES的8.X以上的版本有新的包Elastic.Clients.E…

二极管的“几种”应用

不知大家平时有没有留意&#xff0c;二极管的应用范围是非常广的&#xff0c;下面我们来看看我想到几种应用&#xff0c;也可以加深对电路设计的认识&#xff1a; A&#xff0c;特性应用&#xff1a; 由于二极管的种类非常之多&#xff0c;这里这个大类简单罗列下&#xff1a…