python异常处理

关于异常

在程序运行中,总会遇到各种各样的错误,如打开一个不存在的文件,程序期待用户输入数字,但用户输入了字符串,网络传输终止等,如果不对这些可能引发异常的情况进行处理,就会导致抛出异常程序被终止,这样对用户体验来说是很不友好的,所以为保证程序的健壮性,有必要对一些可能引发异常地方进行异常处理。

如下我们打开一个不存在的文件:

python异常处理

异常语法

基本语法:

try:
     被检测的代码块
except 异常类型:
     处理异常

下面对打开文件异常进行处理

try:
    f = open('a.test')
except FileNotFoundError as e:
    print(e)

处理后效果如下:

python异常处理

有了上面的异常处理后,程序便不会抛出异常正常执行了,异常处理还可以进行多分支处理,如下:

import json
dict_1 = {'a':1,'b':2}
json_obj = json.dumps(dict_1)
try:
    print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
except ValueError as e:
    print(e)
except AttributeError as e:
    print(e)
except TypeError as e:
    print(e)

上面的示例在except 中指定了FileNotFoundError、ValueError、AttributeError等。这是我们猜测可能会引发这些异常,如果异常不在我们的分支中我们则无法捕获对其进行处理了,上述只是在确定只有这几种异常不会出现其它异常的情况下使用,如果不能保证,我们可以使用万能的Except类,它可以接收所有异常。如下:

import json
dict_1 = {'a':1,'b':2}
json_obj = json.dumps(dict_1)
try:
    print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
except Exception as e:  # 万能异常
    print(e)

对比多分支和万能异常Exception:

多分支逻辑结构更加清晰明确,可以根据具体的异常解决对应的问题,但容易出现想的不全面,导致引发其它异常造成程序终止。万能异常Exception虽然可以接收所有异常,但它无法根据具体的异常去解决对应的问题,适用于无论引发什么异常我都执行一个结果,它们各有各的优点,也各有各的不足,多数情况我们可以将它们结合使用,如下:

import json
dict_1 = {'a':1,'b':2}
json_obj = json.dumps(dict_1)
try:
    print(json_obj.keys()) # 将json字符串当字典使用,引发属性异常
except ValueError as e:
    print(e)
except AttributeError as e:
    print(e)
except TypeError as e:
    print(e)
except Exception as e:  # 万能异常
    print(e)

下面来看两个比较有趣的else、finally

import json
dict_1 = {'a':1,'b':2}
json_obj = json.dumps(dict_1)
try:
    print(json_obj)
except ValueError as e:
    print(e)
except AttributeError as e:
    print(e)
except TypeError as e:
    print(e)
except Exception as e:
    print(e)
else:  # 如果没有发生异常,将被执行
    print('如果没有异常,我会被执行')
finally:  # 无论有没有异常,都会被执行
    print('无论有没有异常,我都会被执行,通常是进行清理工作')

else:如果try没有捕获到异常,就执行else内的代码块,如果try捕获到了异常,else的代码块就不会被执行。

finally:无论try捕获到异常还是没捕获到异常都会被执行。

自定义异常

class MyException(Exception):
    '''
    自定义异常类
    '''
    def __init__(self,msg):
        self.msg = msg
    def __str__(self):
        return f'MyException:{self.msg}'

num = input('请输入3位纯数字\n>>>')

try:
    # 这里为了演示,所以使用raise主动抛出异常
    if not num.isdecimal():
        raise MyException('请输入纯数字')
    elif len(num) != 3:
        raise MyException('只能输入3位纯数字')
except MyException as e:
    print(e)

打印内容如下
请输入3位纯数字
>>>a12
MyException:请输入纯数字

raise 可主动抛出异常。

asset断言:asset后面一般是一个表达式,如果表达式结果为True,不会触发断言,如果结果为False将触发断言AssertionError。

如下:引发断言

python异常处理

断言也属于异常,因此也可以使用try进行捕获,如下:

try:
    assert 1<0
except:
    print('触发断言')

这样程序就不会因为断言而终止了,断言一般用于参数检查,如果发现参数有误直接抛出断言终止,避免因为错误的参数导致程序的错误。

Original: https://www.cnblogs.com/caesar-id/p/12859377.html
Author: id_iot
Title: python异常处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/684782/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Maven实现多module打包成单个jar

    首先我们开发的项目一定会是一个父项目和多个子项目 1:我这里有多个子项目,多个项目都继承父项目2:start模块最终会依赖所有的模块,如果我们在打包前不对父项目进行先打包那么,我们…

    技术杂谈 2023年6月1日
    097
  • 这道题你不来了解一下吗

    栈和排序 问题描述 给你一个由1~n,n个数字组成的一个排列和一个栈,要求按照排列的顺序入栈。如何在不打乱入栈顺序的情况下,仅利用入栈和出栈两种操作,输出字典序最大的出栈序列。 排…

    技术杂谈 2023年7月25日
    098
  • 2022.28 技术领导力

    工作越久,越感觉到技术领导力是技术人员最具价值的能力,是技术人员应该持续追求培养的能力。那么,什么是技术领导力,如何培养自己的技术领导力呢?看到下面这篇文章不错,讲出了不同层次技术…

    技术杂谈 2023年5月30日
    0110
  • 设计模式-适配器模式

    类型:结构型 目的:解决接口不兼容问题。 话不多说,看个案例吧。 优化案例 在真实的开发场景中,系统的每个模块都是分配给不同的团队或个人来开发的。这使得事前沟通变得尤为重要,且沟通…

    技术杂谈 2023年7月11日
    064
  • SSM实战(55)在线教育(55)前端(24)课程管理(10)章节添加/修改/删除

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/qiu-hua/p/16514337.htmlAutho…

    技术杂谈 2023年6月1日
    073
  • python爬虫之抓取小说(逆天邪神)

    2022-03-06 23:05:11 申明:自我娱乐,对自我学习过程的总结。 环境: 项目目标: 最终效果:都已实现。可以判断小说更新了没;更新了就下载下来;通过调整小说的已看章…

    技术杂谈 2023年7月11日
    082
  • 内部类

    内部类:将一个类的定义放在另一个类的定义内部。内部类机制可以把逻辑相关的类组织在一起,并控制位于内部的类的可视性。 内部类与组合是完全不同的概念。 内部类不仅是一种代码隐藏机制(将…

    技术杂谈 2023年7月23日
    092
  • 记录接口的请求参数

    package com.example.springboot.log; import com.alibaba.fastjson.JSONObject; import lombok….

    技术杂谈 2023年6月1日
    077
  • Linux中信号量源码的分析

    如果一个任务获取信号量失败,该任务就必须等待,直到其他任务释放信号量。本文的重点是,在Linux中,当有任务释放信号量之后,如何唤醒正在等待该信号量的任务。 信号量定义如下: st…

    技术杂谈 2023年7月24日
    055
  • IIS8的SNI功能实现同一服务器多HTTPS站点

    名词解释: SNI指是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHel…

    技术杂谈 2023年5月31日
    0110
  • 批量下载百度图片+保存到本地+全套代码+标准格式

    python;gutter:true; """批量下载图片"""</p> <p>from url…

    技术杂谈 2023年7月23日
    070
  • 2022年rhce最新认证—(满分通过)

    RHCE认证 重要配置信息 在考试期间,除了您就坐位置的台式机之外,还将使用多个虚拟系统。您不具有台式机系统的 root 访问权,但具有对虚拟系统的完整 root 访问权。 系统信…

    技术杂谈 2023年6月21日
    073
  • golang interface用法

    接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法,就表示它”实现”了该接口无须在该类型上显式添加接口声明。 所谓对应方法,是指有…

    技术杂谈 2023年5月31日
    0106
  • 批量执行失败的Power Automate 流程

    概述 Power Automate 是一个云端的服务,它可以让我们很方便地定义流程,这些流程可以根据事件触发、手工运行、被程序调用、定时运行等,设计这种流程不需要编程能力,它内置了…

    技术杂谈 2023年5月31日
    082
  • SpringMVC学习笔记

    javaSE -> JavaWeb -> SSM(SpringMVC、Spring、MyBatis) -> JavaEE -> SpringBoot、Spr…

    技术杂谈 2023年7月11日
    060
  • 记录一下copy我博客的地址(捂脸)

    背景 今天又需要基于Spring扩展点做些事情,来看看自己之前记录的博客,好奇百度页面搜索了下看看能不能搜出我的文章,发现了熟悉的字眼和图片,发现完全就是自己的…. 有…

    技术杂谈 2023年7月25日
    062
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球