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/582602/

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

(0)

大家都在看

  • 大天使之剑H5游戏超详细图文架设教程

    引言 想体验传奇游戏霸服的快乐吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品装备、翅膀、宠物通通给你,就在大天使之剑! 本文讲解大天使之剑H5游戏的架设教程,…

    Linux 2023年6月7日
    0116
  • Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

    $remote_addr 代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下: &#x7528;&#x62…

    Linux 2023年5月27日
    090
  • RISC-V汇编指南

    The RISC-V Assembly Programmer’s Manual is I think it’s probably better to bee…

    Linux 2023年6月6日
    074
  • 个人学习-STL深入学习01-vectory源码研习 // 需要补充

    STL,即标准模板库(Standard Template Library,STL),内部封装了常见的容器和算法。由六部分组成:1.容器(Containers)2.分配器(Alloc…

    Linux 2023年6月6日
    088
  • fake-useragent库自动生成User-Agent

    安装方法 pip(3) install fake-useragent 使用方法如下: import requests from fake_useragent import User…

    Linux 2023年6月13日
    0118
  • 浪剑天下H5游戏详细图文架设教程

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    096
  • Redis集群的节点通信原理

    Redis集群搭建中,数据如何在节点分布的原理,下面来介绍一下节点之间是如何进行通信(节点握手) 一、基础通讯原理 1、维护集群的元数据的两种方案介绍及对比 在分布式存储中需要提供…

    Linux 2023年5月28日
    0146
  • linux编译安装nginx

    本文升级过程,适用于大部分nginx编译版本 常用编译选项说明nginx大部分常用模块,编译时./configure –help以–without开头的都默认安装。 –prefix…

    Linux 2023年5月27日
    086
  • MAC安装redis

    一、安装命令使用mac的包管理工具brew一行命令搞定安装。若未安装brew,命令行先输入以下命令安装brew。 /usr/bin/ruby -e “$(curl -f…

    Linux 2023年5月28日
    0101
  • ETCD分布式存储部署

    一、ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置。具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的…

    Linux 2023年6月14日
    0101
  • 网络通信知识地图

    知识地图是一种知识导航系统,并显示不同的知识存储之间重要的动态联系。本篇主要就是从更高的视角将之前的文章的结构思路展现出来。文章结构的思路实际上也是达到架构师程度要掌握的网络通信知…

    Linux 2023年6月14日
    0111
  • centos7 设置开机启动任务

    环境:centos7 需求:前两天调通的DNS server(bind/named)设置开机自启动 操作: 修改 /etc/rc.local 注意这个 rc.local 文件默认是…

    Linux 2023年6月6日
    0105
  • 设计模式-单例模式

    目的:为了保证一个类在程序中只有一个实例,并且能被全局访问 场景:全局线程池 要点: 通过 Test::Instance()获取类指针 class Test { public: s…

    Linux 2023年6月8日
    094
  • cpp-变量

    1.枚举类型 枚举类型是用户自定义的类型,在定义时要列举出该枚举类型所有的数值。 定义格式如下: [enum] enumName {val1, val2, val3} 其中的通常为…

    Linux 2023年6月7日
    0100
  • 深入理解java泛型

    什么是Java泛型 泛型的使用 泛型类 泛型接口 泛型方法 泛型的底层实现机制 ArrayList源码解析 什么是泛型擦除 泛型的边界 ?:无界通配符 extends 上边界通配符…

    Linux 2023年6月6日
    0132
  • dpdk21.11 添加igb_uio模块

    dpdk 21.11 添加 IGB_UIO模块 IGB_UIO模块 两种添加方式 零、 下载IGB_UIO模块 一、 直接添加到文件中 1.1 复制 dpdk-kmods/linu…

    Linux 2023年6月6日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球