百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

十七、深入Python异常处理

off999 2024-11-19 08:34 26 浏览 0 评论

「@Author:BY Runsen」

在Python 中的错误和异常是什么?

通常来说,程序中的错误至少包括两种,一种是语法错误,另一种则是异常。

语法错误

所谓语法错误,你应该很清楚,也就是你写的代码不符合编程规范,无法被识别与执行,比如下面这个例子的语法错误

下面的代码无法被识别和执行

if name is not None
    print(name)

上面的代码If 语句漏掉了冒号,不符合 Python 的语法规范,所以程序就会报错invalid syntax

异常

异常则是指程序的语法正确,也可以被执行,但在执行过程中遇到了错误,抛出了异常。

比如,最常见的除数不能为0。变量没有定义。数据类型的运算。

10 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

order * 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'order' is not defined

1 + [1, 2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

上面报的是常见的报错,比如ZeroDIvision NameError 和 typeError

还有很多其他异常的类型如keyError 字典的键找不到和FileNotFoundError 文件不存在

try except

使用Python的异常处理语句,可以非常优雅地处理发生的异常。

下面是Python的异常处理语句的模板语法

try:
    # 可能触发异常的语句块
except:  
    # 这里执行异常处理的相关代码,打印输出等
else:
    # 如果没有异常则执行else中的代码
finally:
    # 不管代码是否异常,都会执行,一般是资源的关闭和释放

首先,检测try语句块中的错误,except语句捕获异常信息并处理。如果在try子句执行时没有发生异常,Python将执行else语句后的语句,然后控制流通过整个try语句。

比如看下面的例子。

try:
    print(a*2)
except TypeError:
    print("TypeError")
except:
    print("Not Type Error & Error noted")
    
Not Type Error & Error noted

由于a没有定义,报的是NameError而不是TypeError。异常最终被except:部分的程序捕捉。

这里,Runsen补充一下非常重要的知识点:

抛出异常

抛出异常模板:raise 异常类名(附加异常信息) 。下面是示例代码:

s = "RunsenRunsen"
try:
    if len(s) > 10:
        raise Exception("超过10个字符")
except Exception as err:
    print(err)
    
超过10个字符

有时产生的异常,不想在当前处理,那么就可以使用raise抛出异常。下面是示例代码:

def division():
    a = float(input('输入被除数:'))
    b = float(input("输入除数:"))
    if a < 0 or b < 0:
        raise Exception("我是Runsen,要求:输入的数不能小于0。") #出现负数抛出异常。
    c = a / b
    print(a,'÷',b,'=',c)
    
try:
    division()
except Exception as d:
    print('出错了,',d)
    
运行结果:
输入被除数:5
输入除数:-1
出错了, 我是小学生,输入的数不能小于0。
输入被除数:5
输入除数:0
出错了, float division by zero

万能异常

因为异常分了不同的种类,如果不知道,那么使用exception异常处理就足够了,它可以接收任何异常

value = 'hello'
try:
    int(value)
#万能异常处理  
except Exception as e:
    print(e)

自定义异常

实际开发中,有时候系统提供的异常类型不能满足开发的需求。这时候你可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承。

# 自定义异常类 MyError ,继承普通异常基类 Exception
class MyError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
try:
    num = input("请输入数字:")
    if not num.isdigit():  # 判断输入的是否是数字
        raise MyError(num)  # 输入的如果不是数字,手动指定抛出异常
except MyError as e:
    print("MyError:请输入数字。您输入的是:", e.value)

请输入数字:1
请输入数字:Runsen
MyError:请输入数字。您输入的是: Runsen

扩展

大型社交网站的后台,需要针对用户发送的请求返回相应记录。用户记录往往储存在 key-value 结构的数据库中,每次有请求过来后,我们拿到用户的 ID,并用 ID 查询数据库中此人的记录,就能返回相应的结果。而数据库返回的原始数据,往往是 json string 的形式,这就需要我们首先对 json string 进行 decode(解码),你可能很容易想到下面的方法:

import json
raw_data = queryDB(uid) # 根据用户的 id,返回相应的信息。queryDB这里是一个函数
data = json.loads(raw_data)

上面的代码是不是就足够呢?

json.loads()函数中,如果输入的字符串不符合规范,那么就无法解码,就会抛出异常。

raw_data一定是json吗?,因此写之前就应该考虑如何处理异常

try:
    data = json.loads(raw_data)
except JSONDecodeError as err:
    print('JSONDecodeError: {}'.format(err))


?

本文已收录 GitHub,传送门~[1] ,里面更有大厂面试完整考点,欢迎 Star。

?


Reference

[1]

传送门~: https://github.com/MaoliRUNsen/runsenlearnpy100

相关推荐

Python Flask 容器化应用链路可观测

简介Flask是一个基于Python的轻量级Web应用框架,因其简洁灵活而被称为“微框架”。它提供了Web开发所需的核心功能,如请求处理、路由管理等,但不会强制开发者使用特定的工具或库。...

Python GUI应用开发快速入门(python开发软件教程)

一、GUI开发基础1.主流GUI框架对比表1PythonGUI框架比较框架特点适用场景学习曲线Tkinter内置库,简单小型应用,快速原型平缓PyQt功能强大,商用许可专业级桌面应用陡峭PySi...

【MCP实战】Python构建MCP应用全攻略:从入门到实战!

实战揭秘:Python Toga 打造跨平台 GUI 应用的神奇之旅

在Python的世界里,GUI(图形用户界面)开发工具众多,但要找到一款真正跨平台、易于使用且功能强大的工具并不容易。今天,我们就来深入探讨一下Toga——一款Python原生、操作系统原...

python应用目录规划(python的目录)

Python大型应用目录结构规划(企业级最佳实践)核心原则模块化:按业务功能拆分,高内聚低耦合可扩展性:支持插件机制和动态加载环境隔离:清晰区分开发/测试/生产环境自动化:内置标准化的构建测试部署流...

Python图形化应用开发框架:PyQt开发简介

PyQt概述定义:PyQt是Python绑定Qt框架的工具集,用于开发跨平台GUI应用程序原理:通过Qt的C++库提供底层功能,PyQt使用SIP工具生成Python绑定特点:支持Windows/ma...

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...

Python、Selenium 和 Allure 进行 UI 自动化测试的简单示例脚本

环境准备确保你已经安装了以下库:SeleniumAllurepytest你可以使用以下命令安装所需库:pipinstallseleniumallure-pytestpytest示例代码下面的代...

LabVIEW 与 Python 融合:打造强大测试系统的利器

在现代测试系统开发领域,LabVIEW和Python各自凭借独特优势占据重要地位。LabVIEW以图形化编程、仪器控制和实时系统开发能力见长;Python则凭借丰富的库资源、简洁语法和强大数...

软件测试进阶之自动化测试——python+appium实例

扼要:1、了解python+appium进行APP的自动化测试实例;2、能根据实例进行实训操作;本课程主要讲述用python+appium对APP进行UI自动化测试的例子。appium支持Androi...

Python openpyxl:读写样式Excel一条龙,测试报表必备!

无论你是测试工程师、数据分析师,还是想批量导出Excel的自动化工作者,只需一个库openpyxl,即可高效搞定Excel的各种需求!为什么选择openpyxl?支持.xlsx格式...

Python + Pytest 测试框架——数据驱动

引言前面已经和大家介绍过Unittest测试框架的数据驱动框架DDT,以及其实现原理。今天和大家分享的是Pytest测试框架的数据驱动,Pytest测试框架的数据驱动是由pytest自...

这款开源测试神器,圆了我玩游戏不用动手的梦想

作者:HelloGitHub-Anthony一天我在公司用手机看游戏直播,同事问我在玩什么游戏?我和他说在看直播,他恍然大悟:原来如此,我还纳闷你玩游戏,咋不用动手呢。。。。一语惊醒梦中人:玩游戏不用...

Python单元测试框架对比(pycharm 单元测试)

一、核心框架对比特性unittest(标准库)pytest(主流第三方)nose2(unittest扩展)doctest(文档测试)安装Python标准库pipinstallpytestp...

利用机器学习,进行人体33个2D姿态检测与评估

前几期的文章,我们分享了人脸468点检测与人手28点检测的代码实现过程,本期我们进行人体姿态的检测与评估通过视频进行人体姿势估计在各种应用中起着至关重要的作用,例如量化体育锻炼,手语识别和全身手势控制...

取消回复欢迎 发表评论: