Python 编程 | 连载 18 - 异常处理(上)

简介: Python 编程 | 连载 18 - 异常处理

一、初识异常

异常与异常处理:

  • 异常既错误
  • 异常会导致程序崩溃并停止运行
  • 异常处理可以捕获到异常,将异常部位的程序进行处理使得程序继续正常运行

异常处理的结构由 try-except 代码块组成

try:
    代码块 #被try关键字检查并保护的代码
except <异常类型> # try关键字检查的代码可能出现的异常的种类
    代码块 # try关键字检查的代码出现异常后执行的代码
复制代码
def upper(str_data):
    new_str = str_data.upper()
    return new_str
res = upper('hero')
print(res)
复制代码

5f275b795f4e477f953ff03879c387a0_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

调用 upper 函数时,传入字符串,函数可以正常执行,如果传入数字则会报错

res_01 = upper(111)
print(res_01)
res_02 = upper('hello')
print(res_02)
复制代码

7af321854f254133a1f6e9e317ca314d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

错误代码后面的代码无论正确与否一旦出现异常,程序就会终止,这个时候就需要对这段可能会出错的代码进行异常处理,确保程序能正常运行。

def upper(str_data):
    new_str = ''
    try:
        new_str = str_data.upper()
    except:
        print('程序执行出现问题')
    return new_str
复制代码

3e65e480e23c48e5b94bea09c131752e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

对函数中可能出现异常的代码进行了异常处理,程序可以正常执行。

捕获异常

可以对try-except代码中的异常进行捕获,再不确定是那种异常的情况下可以使用异常的基类Exception进行捕获

def divid(x, y):
    res = 0
    try:
        res = x / y
    except Exception as e:
        print(e)
    return res
res = divid(1, 2)
print(res)
res_01 = divid(1, 0)
print(res_01)
res_02 = divid(10, 2)
print(res_02)
复制代码

28f30b78edc644588eefbf979d4a53a9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

不使用try-except异常处理,执行函数,查看控制台打印出的具体异常

def divid(x, y):
    res = x / y
    return res
复制代码

ba8bff7a0dac43eea6d063df9d1b29df_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

可以看出控制塔打印的异常为 “ZeroDivisionError: division by zero”,如果可以确定具体的异常类型,也可以在except关键字后捕获具体的异常

def divid(x, y):
    res = 0
    try:
        res = x / y
    except ZeroDivisionError as e:
        print(e)
    return res
复制代码

在对列表和字符串进行索引操作时还会出现索引超出范围异常,使用这个异常看能否不会divid函数中的异常

def divid(x, y):
    res = 0
    try:
        res = x / y
    except IndexError as e:
        print(e)
    return res
复制代码

image.png

程序运行还是出错,这是因为异常类型不匹配,所以没有捕获到,在进行异常处理时如果可以确定具体的异常类型就使用具体的异常类型,如果不确定就是用基类异常,使用的异常不匹配程序仍然不能正确执行

捕获多个异常

可以通过连续添加except代码块的方式捕获多个异常。

try:
    # 代码块
except Eexception1 as e1:
    # 代码块
except EXception2 as e2:
    # 代码块
except EXception3 as e3:
    # 代码块
复制代码

当 except 代码块有多个的时候,当异常类型匹配后,就不会继续往下捕获,也可以使用元组将所有待捕获的异常存起来。

try:
    # 代码块
except (Eexception1, Exception2, Exception3) as e:
    # 代码块
复制代码
def divid(x, y):
    res = 0
    try:
        res = x / y
    except (IndexError, NameError, ZeroDivisionError) as e:
        print(e)
    return res
复制代码

或者

def divid(x, y):
    res = 0
    try:
        res = x / y
    except IndexError as e:
        print(e)
    except NameError as e2:
        print(e2)
    except ZeroDivisionError as e3:
        print(e3)
    return res
复制代码

二、常见异常类型

异常类型名称 异常类型描述
Exception 通用异常类型(基类)
ZeroDivisionError 整除0时出现的异常
AttributeError 对象不含指定属性时出现的异常
IOError IO流输入输出时出现的异常
KeyError 没有指定的键时出现的异常
NameError 指定变量不存在时出现的异常
SyntaxError Python语法错误出现的异常
SystemError 系统错误出现的异常
ValueError 参数值异常

AttributeError

class Student:
    name = None
    age = 7
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return 'Student[name={}, age={}]'.format(self.name, self.age)
stu = Student("stark", 44)
print(stu)
print(stu.address)
复制代码

image.png

该异常类型为 AttributeError,既stu对象没有address属性,通过try-except对异常进行处理

try:
    stu = Student("stark", 44)
    print(stu)
    print(stu.address)
except AttributeError as e:
    print(e)
复制代码

image.png

KeyError

dict_01 = {
    'name': 'stark',
    'age': 44
}
print(dict_01['address'])
复制代码

image.png


相关文章
|
5天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
11天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
11天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
2天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
5天前
|
存储 人工智能 数据挖掘
Python编程入门:打造你的第一个程序
本文旨在为初学者提供Python编程的初步指导,通过介绍Python语言的基础概念、开发环境的搭建以及一个简单的代码示例,帮助读者快速入门。文章将引导你理解编程思维,学会如何编写、运行和调试Python代码,从而开启编程之旅。
27 2
|
6天前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
16 1
|
13天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
9天前
|
存储 网络协议 IDE
从零起步学习Python编程
从零起步学习Python编程
|
12天前
|
机器学习/深度学习 存储 算法
探索Python编程:从基础到高级应用
【10月更文挑战第38天】本文旨在引导读者从Python的基础知识出发,逐渐深入到高级编程概念。通过简明的语言和实际代码示例,我们将一起探索这门语言的魅力和潜力,理解它如何帮助解决现实问题,并启发我们思考编程在现代社会中的作用和意义。
下一篇
无影云桌面