Day24笔记-异常和错误

news2024/9/22 18:28:26

一、异常和错误

1.概念

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

​ Python 的语法错误或者称之为解析错误,是初学者经常碰到的,比如缺少冒号等

​ 在程序运行过程中,总会遇到各种各样的错误,有的错误是程序编写有问题造成的,这种错误我们通常称之为bug,bug是必须修复的;有的错误是用户输入造成的,这种错误可以通过检查用户输入来做相应的处理;还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了,这类错误被称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出

print('start~~~')
list1 = [4,5,7,8]
num = int(input('请输入一个数字:'))  # ValueError: invalid literal for int() with base 10: 'raqrq'
print(list1[num])   # IndexError: list index out of range
print('end~~~~~~')
​
'''
注意:
    a.一般情况下,当程序运行的时候出现的错误被称为异常【Exception】
    b.异常一般使用类表示,比如:IndexError表示索引越界的异常类【列表,元组,字符串】
    c.所有异常类的父类是BaseException或者Exception
    d.异常的特点:当程序运行的过程中遇到了异常,而且该异常未被处理,程序会被终止在异常的代码处,后面的代码将没有执行的机会
    e.在Python中,处理异常的思想:暂时跳过异常的代码,让后面的代码有执行的机会
    f.异常在代码中的出现按只是一种可能性
'''
2.常见异常【面试题】

AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性xIOError 输入/输出异常;基本上是无法打开文件ImportError 无法引入模块或包;基本上是路径问题或名称错误IndentationError 语法错误(的子类) ;代码没有正确对齐IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]KeyError 试图访问字典里不存在的键KeyboardInterrupt Ctrl+C被按下NameError 使用一个还未被赋予对象的变量SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)TypeError 传入对象类型与要求的不符合UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它ValueError 传入一个调用者不期望的值,即使值的类型是正确的

# 【面试题】请列举Python常见的异常,至少5种
​
# 1.NameError 使用一个还未被赋予对象的变量
# print(num)   # NameError: name 'num' is not defined
​
# 2.ValueError 传入一个调用者不期望的值,即使值的类型是正确的
# num = int(input('请输入一个数字:'))   # ValueError: invalid literal for int() with base 10: 'agAG'
​
# 3.TypeError 传入对象类型与要求的不符合
# print('faf' + 19)   # TypeError: can only concatenate str (not "int") to str
# print(19 + 'fagg')    # TypeError: unsupported operand type(s) for +: 'int' and 'str'
​
# 4.AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x
# print('abc'.reverse())   # AttributeError: 'str' object has no attribute 'reverse'
# class Person():
#     def __init__(self,name,score):
#         self.name = name
#         self.score = score
# p = Person('小明',10)
# print(p.scope)
​
# 5.UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
# a = 10
# def func():
#     a += 1    # UnboundLocalError: local variable 'a' referenced before assignment
# func()
# print(a)
​
# def func1():
#     num = 10
#     def func2():
#         print(num)  # UnboundLocalError: local variable 'num' referenced before assignment
#         num = 20
#     func2()
# func1()
​
# 6.MoudleNotFoundError:导入模块的时候,路径有误
# import  aaaa    # ModuleNotFoundError: No module named 'aaaa'
​
# 7.FileNotFoundError:文件路径不存在
# f = open(r'file.txt','r',encoding='utf-8')  # FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'
​
# 8.KeyError 试图访问字典里不存在的键
# dic = {'a':10}
# print(dic['b'])   # KeyError: 'b'
3.异常处理方式

处理异常的本质:没有从根本上解决问题【修改代码】,只是将异常忽略,可以让后面的代码继续执行

3.1try-except-finally/else捕获【重点掌握】
'''
根据具体的需求,try-except-finally/else有不同的书写形式
    a.try-except                *****
    b.try-excpet-else
    c.try-except-finally        *****
    d.try-finally
    e.try-except-except......
'''
​
'''
try:
    代码1
except 异常码  as e:
    代码2
finally:
    代码3
    
注意:
    a.将可能存在异常的代码书写在 【代码1】处,监测起来
    b.如果【代码1】出现异常,肯定会匹配执行相应的【代码2】,如果【代码1】没有异常,则所有的except会被跳过
    c.不管【代码1】是否有异常,【代码3】永远都会执行
    d.except出现一次,且明确了异常码,则只能处理一种异常
    e.当try中的代码出现异常,同样,try中的代码会终止在异常处,后面的代码无法执行
'''
​
# 1.try-except
# print('start~~~')
# try:
#     num = int(input('请输入一个数字:'))
#     print('over~~~~~~~')
# # 此处的e是一个对象,该对象对应的类是ValueError,当代码出现了异常,则异常的对象就会被自动创建出来
# except ValueError as e:  # e = ValueError()
#     # 在异常类中,已经重写了__str__,所以当输出对象的时候,不是默认的地址,而是错误描述信息
#     print(e)   # invalid literal for int() with base 10: 'wyw'
# print('end~~~~~~')
​
# # 2.try-except-except......
# '''
# a.try中如果存在多种异常,都会处理其中的一个异常
# b.类似于if的多分支,如果try中的代码出现异常,会从上往下依次匹配相应的except语句
# '''
# print('start~~~')
# try:
#     list1 = [4,5,7,8]
#     num = int(input('请输入一个数字:'))
#     print(list1[num])
# except ValueError as e:
#     print('ValueError',e)
# except IndexError as e:
#     print('IndexError',e)
# print('end~~~~~~')
​
# 3.try-except + 父类【BaseException/Exception】
# 如果try中代码不确定异常的类型,则可以直接使用父类捕获,任何类型的异常都可以捕获
# print('start~~~')
# try:
#     list1 = [4,5,7,8]
#     num = int(input('请输入一个数字:'))
#     print(list1[num])
# except Exception as e:
#     print('父类~~~',e)
#
# print('end~~~~~~')
​
​
# 4.try-except :省略异常的类型
# print('start~~~')
# try:
#     list1 = [4,5,7,8]
#     num = int(input('请输入一个数字:'))
#     print(list1[num])
# except:
#     print('出现了异常')
#
# print('end~~~~~~')
​
# # 5.try-except-else
# # try-except中的else执行的时机:只有当try中的代码没有异常的时候,else代码块才会被执行
# print('start~~~')
# try:
#     list1 = [4,5,7,8]
#     num = int(input('请输入一个数字:'))
#     print(list1[num])
# except Exception as e:
#     print('父类~~~',e)
# else:
#     print('else被执行了~~~~')
#
# print('end~~~~~~')
​
# 6.try-except-finally
# try-except中的finally执行的时机:不管try中的代码是否有异常,finally代码块都会被执行
# print('start~~~')
# try:
#     list1 = [4,5,7,8]
#     num = int(input('请输入一个数字:'))
#     print(list1[num])
# except Exception as e:
#     print('父类~~~',e)
# finally:
#     print('finally被执行了~~~~')
#
# print('end~~~~~~')
​
# 【面试题】如果函数中出现了try-except-finally,且try或except代码块中出现了return,finally语句仍然会正常执行
# def func():
#     try:
#         list1 = [4,5,7,8]
#         num = int(input('请输入一个数字:'))
#         return list1[num]
#     except Exception as e:
#         print('父类~~~',e)
#         return
#     finally:
#         print('finally被执行了~~~~')
# func()
​
# 7.函数中出现异常的捕获方式
# 方式一:在函数体中捕获
def func():
    try:
        list1 = [4,5,7,8]
        num = int(input('请输入一个数字:'))
        print(list1[num])
    except Exception as e:
        print('父类~~~',e)
func()
​
# 方式二:捕获函数的调用
def func():
    list1 = [4,5,7,8]
    num = int(input('请输入一个数字:'))
    print(list1[num])
​
try:
    func()
except Exception as e:
    print('父类~~~', e)
​
3.2raise抛出
'''
Python异常处理的方式:捕获和抛出
'''
​
# 1.根据具体的问题创建异常对象
# try:
#     list1 = [4,6,7,89,9]
#     print(list1[20])
# except IndexError as e:
#     print(e)
​
# 2.可以通过异常的类创建异常的对象,控制代码的执行
# 语法:raise 异常类('描述信息'),注意:raise常用于自定义异常中
print('start~~~~')
try:
    raise IndexError('索引越界问题')
except Exception as e:
    print(e)
print('end~~~~~~')
​
3.3assert断言
# assert
# 语法:assert 表达式,异常描述信息
# 工作原理:如果表达式成立,则代码正常执行,但是如果表达式不成立,则会出现AssertionError
def div(x,y):
    assert y != 0,'y不能为0'
    return x / y
r = div(3,0)
print(r)
4.自定义异常
# 为了解决实际生活中的特定场景,系统的异常类满足不了需求,则需要自定义异常
​
# 1.自定义一个类,继承自BaseException或Exception
# class CustomException(BaseException):
#     # 2.书写构造函数,在其中定义实例属性
#     def __init__(self,msg):
#         # 调用父类的构造函数,主要是为了使用异常类的机制
#         super().__init__()
#         self.msg = msg
#
#     # 3.重写__str__函数
#     def __str__(self):
#         return self.msg
#
#     # 4.定义一个实例函数,用来解决出现的问题
#     def handle(self):
#         print('问题已解决')
#
# try:
#     raise CustomException('出现了异常')
# except CustomException as e:
#     print(e)
#     e.handle()
​
# 练习:
class LateException(BaseException):
    def __init__(self, msg):
        super().__init__()
        self.msg = msg
​
    def __str__(self):
        return self.msg
​
    def handle(self):
        print('下次一定在八点之前起床')
hour = float(input('请输入你起床的时间:'))
try:
    if hour >= 8:
        raise LateException('上课/上班迟到了')
    else:
        print('正常上课/上班')
except LateException as e:
    print(e)
    e.handle()  

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

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

相关文章

Xilinx系FPGA学习笔记(八)FPGA与红外遥控

系列文章目录 文章目录 系列文章目录红外通信简单介绍红外协议分析 FPGA实现红外通信 红外通信 简单介绍 利用红外线来传送,不干扰其他电器设备工作,也不会影响周边环境,若对发射信号进行编码,可实现多路红外遥控功能。 红外遥控…

全面介绍 CSS 属性值计算 —— 掌握它就了解大部分 CSS

CSS 的核心之一就在此,直接影响我们开发中的调试和布局!!! 举个 🌰:页面上存在一个 h1 元素,不设置任何样式,但是当我们点开 computed 查看,几乎 MDN 上的 CSS 属性都存…

C++高精度计时方法总结(测试函数运行时间)

文章目录 一、clock()函数——毫妙级二、GetTickCount()函数(精度16ms左右)——毫妙级三、高精度时控函数QueryPerformanceCounter()——微妙级四、高精度计时chrono函数——纳妙级五、几种计时比较六、linux下的计时函数gettimeofday()-未测试参考文献 …

C语言6大常用标准库 -- 4.<math.h>

目录 引言 4. C标准库--math.h 4.1 简介 4.2 库变量 4.3 库宏 4.4 库函数 4.5 常用的数学常量 🌈你好呀!我是 程序猿 🌌 2024感谢你的陪伴与支持 ~ 🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长&…

《他们的奇妙时光》圆满收官,葛秋谷新型霸总获好评

9月21日,由王枫、张开法执导,周洁琼、葛秋谷领衔主演的奇幻爱情题材都市喜剧《他们的奇妙时光》圆满收官。该剧讲述了意外被游戏角色刑天附体的设计师宋灵灵,为修复游戏漏洞,被迫与能压制刑天的甲方总裁萧然同居,两人在…

LDR6020在索尼PS5 VR2适配器中的应用技术方案探讨

随着虚拟现实(VR)技术的日益成熟,索尼PlayStation VR2(简称PS VR2)作为新一代VR设备,凭借其出色的性能和沉浸式体验,成为了游戏界的焦点。为了进一步扩大PS VR2的应用范围,索尼推出了…

深度学习02-pytorch-01-张量的创建

深度学习 pytorch 框架 是目前最热门的。 深度学习 pytorch 框架相当于 机器学习阶段的 numpy sklearn 它将数据封装成张量(Tensor)来进行处理,其实就是数组。也就是numpy 里面的 ndarray . pip install torch1.10.0 -i https://pypi.tuna.tsinghua.edu.cn/simp…

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之LCM:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读:MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法,它通过外部检索器获取历史信息,并将其与模型的内部检索过程相结合&#xff…

分布式网络存储技术是什么?分布式存储技术有哪些

分布式储存是指将数据分散存储在多个节点上的一种技术。但是你们知道分布式网络存储技术是什么?相比传统的集中式存储,分布式储存具有更高的可靠性和可用性。分布式网络存储是一种将数据分散存储在多个节点或服务器上的架构。 分布式网络存储技术是什么&…

开源 AI 智能名片 S2B2C 商城小程序与营销工具的快速迭代

摘要:本文以开源 AI 智能名片 S2B2C 商城小程序为研究对象,探讨在营销工具快速迭代的背景下,该小程序如何借鉴以拼多多为代表的“小程序拼团”、以蘑菇街为代表的“小程序直播”、以花点时间为代表的“小程序按月订花”等经典案例&#xff0c…

springboot注册和注入组件方式概览

IoC:Inversion of Control(控制反转) 控制:资源的控制权(资源的创建、获取、销毁等) 反转:和传统的方式不一样了 DI :Dependency Injection(依赖注入) 依赖&…

【HTTPS】对称加密和非对称加密

HTTPS 是什么 HTTPS 是在 HTTP 的基础上,引入了一个加密层(SSL)。HTTP 是明文传输的(不安全) 当下所见到的大部分网站都是 HTTPS 的,这都是拜“运营商劫持”所赐 运营商劫持 下载⼀个“天天动听“&…

剖析枚举类型的使用与优点

枚举类型顾名思义——就是把所有的值一一列举出来 列如星期 把每一项都列举出来就是枚举 这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值, 要是在某一项赋初值之后,后面的就会…

客户转化预测以及关键因素识别_支持向量机与相关性分析

数据入口:数字营销转化数据集 - Heywhale.com 数据集记录了客户与数字营销活动的互动情况。它涵盖了人口统计数据、营销特定指标、客户参与度指标以及历史购买数据,为数字营销领域的预测建模和分析提供了丰富的信息。 数据说明: 字段说明Cu…

JavaEE: 创造无限连接——网络编程中的套接字

文章目录 Socket套接字TCP和UDP的区别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP api的使用UDPDatagramSocketDatagramPacketInetSocketAddress练习 TCPServerSocketSocket练习 Socket套接字 Socket是计算机网络中的一种通信机制&#xff0…

Clion使用vcpkg管理C/C++包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

cgroup基本原理与使用

Linux cgroups是Linux内核中的一项强大功能,允许用户对进程进行**资源限制、优先级控制、监控和隔离。它主要用于管理和控制计算资源的分配,特别是在容器技术(如 Docker 和 LXC)中得到了广泛应用。 1. Cgroups的基本概念和原理 …

Qwen-2.5 + ClaudeDev + Aider:这套免费的AI编程工具链,简直太棒了!

Qwen-2.5 ClaudeDev Aider:这套免费的AI编程工具链,简直太棒了! 原创 Aitrainee AI进修生 🍹 Insight Daily 🪺 Aitrainee | 公众号:AI进修生 Hi,这里是Aitrainee,欢迎阅读本…

AI字幕翻译器行业分析:前五大厂商占有大约29.5%的市场份额

AI 字幕翻译器正在彻底改变我们使用不同语言消费媒体的方式,使内容可以普遍访问。这些先进的技术利用机器学习和自然语言处理,将口语对话实时翻译成字幕。这一功能不仅打破了语言障碍,提升了观众的体验,而且还使内容创作者能够毫不…

比 Kimi 更强!用 Claude 仿写头条文章,轻松过原创(附完整指令)

最近,我有个做头条号的朋友跟我吐槽,说每天都要更新内容,经常写文章写到半夜,他已经快撑不住了。我听完实在有点不忍心,就告诉他,其实可以用 AI 来帮忙写头条文章。 朋友一脸怀疑,说“怎么可能&…