Python中的异常处理机制

news2025/1/18 8:34:59

 

什么是异常与异常处理

异常就是错误

异常会导致程序崩溃并停止运行

能监控并捕获到异常,将异常部位的程序进行修理使得程序继续正常运行

异常的语法结构

try:

    <代码块1> 被try关键字检查并保护的业务代码

except <异常的类型>:

    <代码块2> # 代码块1出现错误后执行的代码块

捕获通用异常

无法确定是哪种异常的情况下使用的捕获方法

try:

    <代码块>

except Exception as e:

    <异常代码块>
def upper(str_data):
    new_str = ''
    try:
        new_str = str_data.upper()
    except Exception as e:
        print('程序出错了:{}'.format(e))
    return new_str

result = upper(1)
print('result:', result)

程序出错了:'int' object has no attribute 'upper'
result: 

捕获具体异常

确定是哪种异常的情况下使用的捕获方法

except <具体的异常类型> as e
def test():
    try:
        print('123')
        1 / 0
        print('hello')
    except ZeroDivisionError as e:
        print(e)

test()

123
division by zero

捕获多个异常1

try:

    print('try start')

    res = 1 / 0

    print('try finish')

except ZeroDivisionError as e:

    print(e)

except Exception as e: # 可以有多个except

    print('this is a public excpt, bug is: %s' %e)

当except代码块有多个的时候,当捕获到第一个后,不会继续往下捕获。

捕获多个异常2

try:
    print('try start')
    res = 1 / 0
    print('try finish')
except (ZeroDivisionError, Exception) as e:
    print(e)

当except代码后边的异常类型使用元组包裹起来,捕获哪种就抛哪种

def test1():
    try:
        print('hello')
        print(name)
    except (ZeroDivisionError, NameError) as e:
        print(e)

test1()

hello
name 'name' is not defined

异常类型集合

异常名称说明
Exception通用异常类型(基类)
ZeroDivisionError不能整除0
AttributeError对象没有这个属性
IOError输入输出操作失败
IndexError没有当前的索引
KeyError没有这个键值(key)
NameError没有这个变量(未初始化对象)
SyntaxErrorPython语法错误
SystemError解释器的系统错误
ValueError传入的参数错误
# coding: utf-8

class Test(object):
    pass

t = Test()
try:
    t.name
except AttributeError as e:
    print(e)

d = {'name': 'xiaomu'}
try:
    d['age']
except KeyError as e:
    print('没有对应的键:', e)

l = [1, 2, 3]
try:
    l[5]
except IndexError as e:
    print(e)

name = 'dewei'
try:
    int(name)
except ValueError as e:
    print(e)

def test(a):
    return a

try:
    test()
except TypeError as e:
    print(e)

finally的功能

无论是否发生异常,一定会执行的代码块

在函数中,即便在try或except中进行了return也依然会执行finally语法块

try语法至少要伴随except或finally中的一个

finally的用法

try:
    <代码块1>
except:
    <代码块2>
finally:
    <代码块3>
def test2():
    try:
        1 / 0
    except Exception as e:
        print('except')
        return e
    finally:
        print('finally')

print('------------')
result = test2()
print(result)

def test5():
    try:
        print('1 try')
        return 'try'
    except Exception as e:
        print('e')
    finally:
        print('2 finally')
        return 'finally'

print('=======')
result = test5()
print(result)

finally的历史

在Python2.5之前的版本,finally需要独立使用,不可以和try配合,之后才演变成现在的模式。

自定义抛出异常函数--raise

将信息以报错的形式抛出

用法:

        rasie 异常类型(message)

参数:

        message:错误信息

返回值:无

def test4(name):
    if name == 'dewei':
        raise Exception('dewei不可以被填写')
    return name

test4('dewei')

自定义异常类

继承基类 Exception

在构造函数中定义错误信息

class NumberLimitError(Exception):
    def __init__(self, message):
        self.message = message

class NameLimitError(Exception):
    def __init__(self, message):
        self.message = message

def test5(name):
    if name == 'dewei':
        raise NameLimitError('dewei不可以被填写')
    return name

def test6(number):
    if number > 100:
        raise NumberLimitError('数字不可以大于100')
    return number

断言的功能--assert

用于判断一个表达式,在表达式条件为false的时候触发异常

断言的用法--assert

用法:

        assert expression, message

参数:

        expression: 表达式,一般是判断相等,或者判断是某种数据类型的bool判断的语句

        message:具体的错误信息

返回值:

        无返回值

bug定义

程序中出现的错误,但有没有通过异常去捕获,以至于直接抛出,导致程序的崩溃。

可以使用debug和断点的方式进行调试。

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

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

相关文章

Mybatis源码细节探究:sqlSessionFactory.openSession()这个方法到底发生了什么?

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

【笔记】【Javascript】浅面了解原型和原型链

前言 原型和原型链是学习前端必备知识笔记中有些个人理解后整理的笔记&#xff0c;可能有所偏差&#xff0c;也恳请读者帮忙指出&#xff0c;谢谢。 免责声明 为了方便&#xff0c;本文中使用的部分图片来自于网络&#xff0c;如有侵权,请联系博主进行删除&#xff0c;感谢其…

C++ 二分查找法 LeetCode:704. 二分查找

class Solution { public:int search(vector<int>& nums, int target) {int length nums.size();//计算容器长度int left 0;//0int right length-1;//5int middle 0;/*while(left<right){middle (leftright)/2;//middle (leftright)>>1;if(nums[middl…

mysql子查询嵌套

目录 前言 一、实际需求解决 1.方式1&#xff1a;自连接 2.方式2&#xff1a;子查询 二、单行子查询 1.操作符子查询 三、相关子查询 四、自定义语句 五、子查询的问题 1.空值问题 2.非法使用子查询 六、多行子查询 七、聚合函数的嵌套使用 八、多行子查询空值问题…

Python爬虫实战——获取指定博主所有专栏链接及博文链接

Python爬虫实战——获取指定博主所有专栏链接及博文链接 0. 前言1. 第三方库的安装2. 代码3. 演示效果 0. 前言 本节学习使用爬虫来爬取指定csdn用户的所有专栏下的文章 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版…

带你学C带你飞-P16拾遗

自增运算符 #include <stdio.h> int main() {int i5,j;j i;printf("i%d,j%d",i,j);i5;ji;printf("i%d,j%d",i,j); }i:先使用i的值&#xff0c;再对i自身进行加一 i&#xff1a;先对i自身加一&#xff0c;再赋值给j 逗号运算符 条件运算符 三目运…

【Linux】冯诺依曼体系结构、操作系统概念、进程概念

文章目录 前言一、冯诺依曼体系结构1.简介冯诺依曼体系2.CPU3.存储器3.IO&#xff08;输入输出&#xff09;4.总结 二、操作系统&#xff08;OS&#xff09;1.操作系统是什么&#xff1f;2.为什么有操作系统&#xff1f;&#xff08;功能&#xff09;3.操作系统如何实现功能&am…

MySQL之触发器相关操作

1. 概念 触发器&#xff0c;就是⼀种特殊的存储过程。触发器和存储过程⼀样是⼀个能够完成特定功能、存储 在数据库服务器上的SQL⽚段&#xff0c;但是触发器⽆需调⽤&#xff0c;当对数据表中的数据执⾏DML操作时 ⾃动触发这个SQL⽚段的执⾏&#xff0c;⽆需⼿动调⽤。 在MyS…

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Kinp、管理 GitHub 通知、WebXR

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;杏花乌龙拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

【LeetCode232】用栈模拟实现队列

你好&#xff0c;欢迎来到我的博客&#xff01;作为一名程序员&#xff0c;我经常刷LeetCode题目来提升自己的编程能力。在我的博客里&#xff0c;我会分享一些我自己做过的题目和解题思路&#xff0c;希望能够帮助到大家。今天&#xff0c;我想和大家分享一道挑战性较高的题目…

【牛客刷题专栏】0x29:JZ31 栈的压入、弹出序列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

周赛346(括号匹配问题变形、双指针、模拟/打表预处理+DFS)

文章目录 周赛346[2696. 删除子串后的字符串最小长度](https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/)暴力模拟使用栈 [2697. 字典序最小回文串](https://leetcode.cn/problems/lexicographically-smallest-palindrome/)双指针 [2698. 求一个…

开放原子训练营(第三季)inBuilder低代码开发实验室之低代码浪潮已至

目录 、前言&#xff1a; 一、为什么选择它 二、小试牛刀 3.1设计源数据 3.2设计页面 3.3发布应用 四、总结 、前言&#xff1a; 当你还在沉浸于AI和大数据浪潮带来的影响时&#xff0c;另一种低代码或0代码的编程方式在市场流行&#xff0c;截止至2023年&#xff0c;低代码的浪…

浅浅谈谈ssm的那些事儿外加AOP和DI+DAO思想的理解和处理json数据的第三方工具

MyBatis 一级缓存 默认是打开的 SqlSession级别的缓存&#xff0c;同一个SqlSession的发起多次同构查询&#xff0c;会将数据保存在一级缓存中。 在sqlsession 中有一个数据结构 是map 结构&#xff0c; 这个区域就是一级缓存区域&#xff0c;一级缓存区域中的 key 是由 sql 语…

11.Mysql内核语句优化规则详解

MySQL性能调优 1. 条件化简1.1 移动不必要的括号1.2 常量传递1.3 移动没用的条件1.4 表达式计算1.5 常量表检测 2. 外连接消除3. 子查询MySQL内部优化规则3.1 子查询语法3.1.1 按返回的结果集区分子查询标量子查询行子查询列子查询表子查询 3.1.2 按与外层查询关系来区分子查询…

20230522打开cv1826的buildroot的内核的早期打印的功能

20230522打开cv1826的buildroot的内核的早期打印的功能 在CV1826的buildroot启动的时候&#xff0c;有些内核打印/printk显示不了。 大概在内核时间3-4s秒钟的前后&#xff0c;有一段内核打印丢失了&#xff01; 在CV1826的buildroot启动到uboot的时候&#xff0c;按ctrlC组合…

性能优化之思路和分析

、优化思路 尽可能减少首屏必须资源的体积尽可能提前首屏必须资源/接口的请求发起时机延后闲时预缓存非必要资源/请求 代码分离 https://webpack.docschina.org/guides/code-splitting/ 动态导入 https://webpack.docschina.org/guides/code-splitting/#dynamic-imports sp…

vector模拟

先来看看vector的源码&#xff0c;string没有看是因为string严格意义上来讲不属于STL。 源代码之间也是存在区别的&#xff0c;大同小异&#xff0c;可以去网上查如何下载STL的源码库。 先看看<vector>文件中的内容&#xff08;当做参考即可&#xff09;&#xff1a; 内容…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【分布式系统】分布式锁实现之Redis

锁有资源竞争问题就有一定有锁的存在&#xff0c;存储系统MySQL中&#xff0c;有锁机制保证数据并发访问。而编程语言层面Java中有JUC并发工具包来实现&#xff0c;那么锁解决的问题是什么&#xff1f;主要是在多线程环境下&#xff0c;对共享资源的互斥。从而保证数据一致性。…