常见错误和异常,常见异常处理

news2024/11/16 13:48:22

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

语法错误

下面的例子中的问题是print()前面缺少一个冒号:

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

异常 

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

异常处理

2,异常处理的关键字为 try 、 except 、 finally 、 else ,在 try 语句中捕捉异常(如果没有异常,则执行 else 语句);然后在 except 中处理异常; finally 作为异常的统一出口,不管是否发生异常,都要执行此段代码。

1)try/except

try:
    result=10/0
    print("数学计算")
except ZeroDivisionError as err:
    print("出现异常")

2)try/except...else

当try语句中定义的代码不会产生任何异常时,在try语句中执行完毕会自动执行else语句。

try:
    result=10/0
    print("数学计算")
except ZeroDivisionError as err:
    print("出现异常")
else:
    print("程序未出现异常")

3)try-finally 语句

在整个异常处理过程中,无论是否出现异常,最终都会执行finally语句块中的代码,而此代码将成为异常的统一出口。

try:
    result=10/0
    print("数学计算")
except ZeroDivisionError as err:
    print("出现异常")
else:
    print("程序未出现异常")
finally:
    print("异常统一出口")   

5)处理多个异常

一个程序代码有可能会产生多种类型的异常。

try:
    a=int(input("请输入第一个数字"))
    b=int(input("请输入第一个数字"))
    result=a/b
    print("数学计算")
except ZeroDivisionError as err:
    print("出现异常:%s"%err)
except ValueError as err:
    print("出现异常:%s"%err)
else:
    print("程序未出现异常")
finally:
    print("异常统一出口")   

4)抛出异常

先验知识:使用Exception类捕获异常——无论出现任何异常,都可以使用同一个except语句进行异常处理。

3,Python中异常的最大父类是 BaseException ,其中 Exception 是程序运行中出现的主要异常。

4.发生异常后, Python 虚拟机会自动产生一个异常类的实例化对象,并匹配相应的 except 语句中的异常类型,由于对象多态性的支持,所有产生的异常类实例都可以通过 Exception 接收。

try:
    a=int(input("请输入第一个数字"))
    b=int(input("请输入第一个数字"))
    result=a/b
    print("数学计算")
except Exception as err:
    print("出现异常:%s"%err)
else:
    print("程序未出现异常")
finally:
    print("异常统一出口")   

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

5.在 Python 中除了可以自动实例化异常类对象之外,也可以利用 raise 手工抛出异常。

#第一种——指定了要被抛出的异常。
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

#第二种——指定了要被抛出的异常。
try:
    raise NameError('HiThere')  # 模拟一个异常。
except NameError:
    print('An exception flew by!')

An exception flew by!

#第三种——如果你只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 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

5)用户自定义异常

为了明确地描述与业务相关的异常,实际项目开发往往会采用自定义异常的形式,使用特定的类来标注异常。

通过创建一个新的异常类来拥有自己的异常。异常类继承自 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!'

6)with关键字

with 语句实现原理建立在上下文管理器之上。上下文管理器是一个实现 __enter__ 和 __exit__ 方法的类。使用 with 语句确保在嵌套块的末尾调用 __exit__ 方法。这个概念类似于 try...finally 块的使用。

换句话说:with语句定义了一个对象的上下文管理,在此结构执行时会自动调用__enter__()进行上下文初始化,当调用结束后也会自动调用 __exit__()释放相应资源。

#最开始的代码
file = open('./test_runoob.txt', 'w')
file.write('hello world !')
file.close()
以上代码如果在调用 write 的过程中,出现了异常,则 close 方法将无法被执行,因此资源就会一直被该程序占用而无法被释放。

#改进版
file = open('./test_runoob.txt', 'w')
try:
    file.write('hello world')
finally:
    file.close()
以上代码我们对可能发生异常的代码处进行 try 捕获,发生异常时执行 except 代码块,finally 代码块是无论什么情况都会执行,所以文件会被关闭,不会因为执行异常而占用资源。

#使用with关键字
with open('./test_runoob.txt', 'w') as file:
    file.write('hello world !')
使用 with 关键字系统会自动调用 f.close() 方法, with 的作用等效于 try/finally 语句是一样的。

7)assert

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

assert expression
等价于:
if not expression:
    raise AssertionError

实例:
>>> assert True     # 条件为 true 正常执行
>>> assert False    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1==1    # 条件为 true 正常执行
>>> assert 1==2    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2
>>>

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

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

相关文章

拉取阿里云镜像到linux环境

1. 登录阿里云Docker Registry docker login --username<你的阿里云账号> registry.cn-hangzhou.aliyuncs.com2、到阿里云容器镜像服务查看镜像版本 3、拉取阿里云镜像到linux docker pull registry.cn-hangzhou.aliyuncs.com/study-img/kafka:3.7.04、查看linux服务器…

开源AI智能名片商城小程序在私域流量运营中的转化效率与ROI提升研究

摘要 在数字化浪潮的推动下&#xff0c;企业营销环境正经历着前所未有的变革。公域流量的高成本与低转化率迫使企业寻找新的增长点&#xff0c;而私域流量以其低成本、高粘性、可复用等优势逐渐成为企业营销战略的核心。开源AI智能名片商城小程序作为一种创新的数字化工具&…

非常nice! IDEA远程Debug调试程序

IDEA远程Debug调试程序 1.IDEA里边开发一个app程序 没什么写的&#xff0c;画个小心心. maven打包可执行的jar maven package 1. 上传jar到远程服务器并启动 1.1 win远程上传jar到远程服务器 scp IDEADebug-1.0-SNAPSHOT.jar rootnode01:/opt/ 1.2 配置远程应用以支持调试: 在远…

Linux网络编程2(理解局域网)

前面的一篇文章&#xff0c;我们简单地了解了网络的发展过程&#xff0c;并且简单的介绍了网络的一些基本术语&#xff0c;这篇文章&#xff0c;我们来详细的了解一下局域网的内容&#xff0c;相信看完这篇文章&#xff0c;大家能够对局域网有清晰的认识。 教科书一般是按照五层…

参与团体标准的意义以及作用

随着经济的快速发展和科技的不断进步&#xff0c;行业的规范与统一变得愈发重要。团体标准应运而生&#xff0c;成为了推动行业前行的强大力量。参与其中&#xff0c;其所带来的作用和意义犹如璀璨星辰&#xff0c;照亮了发展的道路 参与团体标准具有诸多显著的作用&#xff0c…

【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】

0 ref属性&#xff08;组件间通信&#xff09; # 1 ref属性放在普通标签上<input type"text" v-model"name" ref"myinput">通过 this.$refs[myinput] 拿到的是 原生dom对象操作dom对象&#xff1a;改值&#xff0c;换属性。。。# 2 ref属…

天机学堂第11天 异步领劵

目录 优化思路分析 缓存数据结构 异步领券 优化思路分析 高并发写优化的几种思路 合并写请求比较适合应用在写频率较高&#xff0c;写数据比较简单的场景。而异步写则更适合应用在业务比较复杂&#xff0c;业务链较长的场景。 显然&#xff0c;领券业务更适合使用异步写方…

排序(直接插入,希尔,选择,快排)

文章目录 插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序 交换排序冒泡排序&#xff1a;快速排序&#xff08;hoare版本&#xff09;快速排序优化&#xff08;三数取中&#xff09;快速排序优化&#xff08;小区间优化&#xff09; 快速排序&#xff08;挖坑法&…

Unity转Unreal5从入门到精通之UMG的使用

前言 UMG (Unreal Motion Graphics UI Designer)是Unreal种的可视化 UI 工具。它就类似于Unity中的UGUI,可用于为用户创建游戏内 HUD、菜单和其他与界面相关的图形。 UMG 的核心是UI控件。它可用于创建UI界面&#xff08;按钮、复选框、滑块、进度条等&#xff09;。 快速入…

HiveSQL实战——大数据开发面试高频SQL题

查询每个区域的男女用户数 0 问题描述 每个区域内男生、女生分别有多少个 1 数据准备 use wxthive; create table t1_stu_table (id int,name string,class string,sex string ); insert overwrite table t1_stu_table values(4,张文华,二区,男),(3,李思雨,一区,女),(1…

linux -- Git基础使用

git是什么 简单说来Git是一个开源的分布式版本控制系统&#xff0c;那么什么是分布式呢&#xff0c;就是每个开发者拥有完整的本地仓库副本&#xff0c;包括所有历史记录和分支&#xff0c;可以独立工作&#xff0c;并通过合并来同步变更。 git优点 速度极快 Git在合并、分…

嵌入式 - 什么是数字晶体管

What is a digital transistor? 数字晶体管是一种集成电阻器的双极晶体管。 A digital transistor is a bipolar transistor that integrates resistors. Concerning internal resistor R1 / 关于内部电阻 R1 R1 的作用是通过将输入电压转换为电流来稳定晶体管的工作。 如果…

【秋招笔试】8.17京东秋招第二场(后端岗)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

Nginx:高效HTTP服务器与反向代理

Nginx&#xff1a;高效HTTP服务器与反向代理 1、核心特点2、应用场景 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Nginx&#xff0c;一个开源的HTTP服务器与反向代理工具&#xff0c;因其高性能、低资源消耗而备受推崇。以下是Nginx的几…

Python 全栈系列261 使用apscheduler

说明 任务可以分为两种&#xff1a; 1 静态(存量)任务2 动态(增量)任务 对于静态任务来说&#xff0c;一般可以事先分好大小均匀的若干block任务&#xff0c;这时候比较强调使用分布式系统进行快速处理&#xff1b;对于动态任务来说&#xff0c;主要按时间区块大小划分。对于…

[JAVA] Java中如何使用throws语句声明异常类型

如果一个方法可能会出现异常&#xff0c;但没有能力处理这种异常&#xff0c;可以在方法声明处用throws子句来声明抛出异常 — throws语句用在方法定义时声明该方法要抛出的异常类型 public void method() throws Exception1,Exception2,...ExceptionN{//可能产生异常的代码 }…

LVS配置

基础介绍 http://t.csdnimg.cn/Lv5Byhttp://t.csdnimg.cn/Lv5By 部署NAT模式集群案例 实验环境 主机名 IP vip 角色 node1 192.168.0.100 172.25.254.100 调度器&#xff08; VS &#xff09; node1 192.168.0.101 &#xff0c; GW 192.168.0.100 \ 真实服务器&#…

HarmonyOS开发案例:创建全局自定义组件复用池-BuilderNode

介绍 本示例是全局自定义组件复用实现的示例代码&#xff0c;主要讲解如何通过BuilderNode创建全局的自定义组件复用池&#xff0c;实现跨页面的组件复用。 效果图预览 使用说明 继承NodeController&#xff0c;实现可复用的NodeItem组件。使用单例模式创建NodePool组件复用…

leetcode算法题之N皇后

N皇后也是一道很经典的问题&#xff0c;问题如下&#xff1a; 题目地址 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你…

2:html:基础语法2

目录 2.1图像的一些注意点 2.2表格 2.2.1基本的表格 2.2.2表头与边框 2.3列表 2.3.1无序列表 2.3.2有序列表 2.4块 2.4.1块级元素 2.4.2内联元素 2.1图像的一些注意点 在上一篇中&#xff0c;我们已经知道了怎么样去将图片运用到我们的网站中&#xff0c;但是这里还…