Python学习之异常处理详解

目录
  • 什么是异常与异常处理
  • 异常的语法
  • 捕获通用异常
  • 捕获具体异常
  • 如何捕获多个异常
    • 捕获多个异常-方法1
    • 捕获多个异常-方法2

本章节主要学习 python 中的异常处理,来看一下该章节的内容有哪些。首先我们需要了解 什么是异常与异常的处理 ,然后再继续 异常的语法结构

什么是异常与异常处理

异常 —> 可以理解为不同寻常。

正常情况下,我们的程序是自上而下的逐行执行,执行到最后一行才会终止程序的执行。而异常的情况会导致我们的程序半途而废停止了执行。一般情况下的停止执行都是因为我们的程序出错而造成的,而异常就是错误,异常的出现会导致我们的程序崩溃并停止运行。这在我们的工作中是非常不友好的!

纵观程序的一生,都不能保证说程序一定不会出错。所以当遇到错误的时候,为了不影响程序的执行,我们就需要对这些异常进行处理, Python 中的异常机制,可以监控并捕获到异常。当程序出现错误的时候对异常进行临时妥善的处理,就可以使得程序继续正常的运行。

总结:

异常的本质就是错误

异常的出现会导致程序的崩溃且会停止执行

监控异常并捕获,将造成异常的程序进行妥善的处理可以使得程序能够继续正常的运行

接下来我们就快快的看一下 究竟如何捕获异常并进行异常处理的语法吧。

异常的语法

try:                   # 异常的关键字,尝试的意思
    <代码块1>               # 被 try 关键字检查并保护的业务代码块

except <异常的类型>:         # 发现异常后的处理关键字,会跟随一个错误类型(异常类型),异常类型可以不填写
    <代码块2>               # try 的代码块出现错误之后,就会执行 except 的代码块
                       # 这里一般都是当 try 代码块出现错误之后的补救逻辑

来看一个简单的示例:

1 / 0		# 我们都知道 0 不能被整除,所以产生了下面这样的报错

# >>> 执行结果如下
# >>> ZeroDivisionError: division by zero 

# >>> 我们管代码的报错叫做 异常的抛出 ,这个报错信息告诉了我们为什么报错,同时业务也会被停止。
# >>> 在程序中,我们是允许出错的,但是需要对可能遇见的异常捕获,
# >>> 进行合理的处理,让程序遇到异常可以合理的运行

看一下针对上文示例的异常进行的捕获

try:
    1 / 0
except:
    print('注意:0 不可以被 1 整除')
    print('ZeroDivisionError: division by zero 已捕获,程序继续执行')

# >>> 执行结果如下
# >>> 注意:0 不可以被 1 整除
# >>> ZeroDivisionError: division by zero 已捕获,程序继续执行

# >>> 虽然 try 代码块抛出了异常,但是我们通过 except 进行了合理的规避,使得我们的程序继续向下执行

接下来我们再利用我们之前学到的知识点 upper() 函数做一个小案例:

定义一个 upper ,利用 upper() 函数 。将传入的字符串转为大写,如传入参数非 字符串 ,捕获该异常并处理。

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except:
        print('upper() 函数转换字符大写失败!', '返回结果为:', new_str)
    return new_str

result = upper('test')
print('传入参数返回值为:', result)

# >>> 执行结果如下:
# >>> 传入参数返回值为: TEST

result = upper(1)
print(result)

# >>> 执行结果如下:
# >>> upper() 函数转换字符大写失败! 返回结果为: None

捕获通用异常

刚刚我们通过 try…except… 捕获了异常并进行了合理的处理,但是我们并不知道错误的原因是什么。所以我们必须获取 异常的类型 ,首先我们来学习一下如何获取通用异常类型, 通用异常类型 是我们无法确定是那种异常的情况下使用的一种捕获方法。

用法如下:

try:
    <代码块>
except Exception as e:        # 把通用异常的错误原因转换成变量 e , as 为关键字
                            # 也可以理解为 将 Exception 通用异常类型 起一个别名 e
                            # e 变量名可以起任意名字,一般约定成俗都会使用 e 作为异常捕获的变量名
                            # e 就是 error 的缩写
    <异常代码块>

通用异常捕获示例如下:

def upper(str_data):
    new_str = None

    try:
        new_str = str_data.upper()
    except Exception as e:
        print('upper() 函数转换字符大写失败!', '返回结果为:{}'.format(e))
    return new_str

result = upper(1)
print(result)

# >>> 执行结果如下:
# >>> upper() 函数转换字符大写失败! 返回结果为:'int' object has no attribute 'upper'

捕获具体异常

捕获具体的异常就是我们可以确定在 try 的代码块中会出现哪种具体的异常类型,并将其捕获的方法。语法方面与通用异常一样,在异常类型区域书写 具体的异常类型 就可以了。

我们以上文的 ZeroDivisionError: division by zero 为例

try:
    1 / 0
except ZeroDivisionError as e:		# 书写指定的异常类型:ZeroDivisionError
    								# ZeroDivisionError 是Python内置的具体异常:0不能被整除
    print(e)

# >>> 执行结果如下:
# >>> division by zero

小节:思考一个问题,工作中我们是使用 通用的异常 还是 具体的异常 呢?

从方便的角度来说,使用通用的异常会比较简单。开发成本低,不需要关心具体的异常类型是什么。其实 Exception 也不知知道具体的异常是哪一种类型,它需要去浩瀚的异常库查找,找到之后进行对应的抛出,虽然没有 具体指定异常 处理的那么快,但是这个处理速度也是无感知的。

如果我们能知道 try 代码块中 可能出现的具体异常类型,还是希望使用具体的异常类型。这样可以精准的对应错误;

==需要注意的是:当我们的 try 代码块中,没有出现我们指定的 具体异常 类型,代码执行依然是会报错的。==所以各有利弊,可以根据我们工作中业务的具体情况进行使用。

如何捕获多个异常

在我们平时的开发工作中,很可能在同一个代码块中出现多个异常类型。那么我们该如何支持多个异常的捕获呢?

其实异常的捕获是非常灵活的,也支持多个异常捕获的方式。

捕获多个异常 - 方法1

try:
    result = 1 / 0
except ZeroDivisionError as e1:
    print(e1)
except Exception as e2:            # 可以使用多个 except 来捕获多个异常
    print('this is a public except , bug is %s' % e2)

# >>> 需要注意的是,当 except 代码块中有多个异常的时候,当捕获到第一个异常后,不会在继续往下捕获。

需要注意的是,当 except 代码块中有多个异常的时候,当捕获到第一个异常后,不会在继续往下捕获。

捕获多个异常 - 方法2

try:
    result = 1 / 0
except (ZeroDivisionError, Exception) as e:        # 在 except 后面的小括号内定义多个 异常类型 ,(小括号其实是元组)
                                                # 当 except 后面使用元组包裹多个 异常类型 时,捕获到哪种异常类型就抛出哪种
    print(e)

示例如下:

def test():

    try:
        print(name)     # 因为不存在 name 这个变量,所以会抛出一个 NameError: name 'name' is not defined 异常
                        # 尝试捕获  NameError 异常
    except (ZeroDivisionError, NameError) as e:
        print(e)
        print(type(e))

test()

# >>> 执行结果如下:
# >>> name 'name' is not defined
# >>> <class 'NameError'>

比较常用的捕获异常方法是第二种。

到此这篇关于Python学习之异常处理详解的文章就介绍到这了,更多相关Python异常处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何在Python中进行异常处理

    目录 一.抛出异常和自定义异常 1.raise语句 2.自定义异常类型 二.捕捉异常 1.捕捉多个异常 2.获取异常信息 三.finally子句 一.抛出异常和自定义异常 Python中使用用异常对象(exception object)表示异常情况,当程序运行遇到错误后,就会触发发异常.相信大家在编码是都会遇到这种情况,那么如果异常对象并未被处理或捕捉,程序就会用报错然后终止执行. 1.raise语句 Python中的raise 关键字用于触发发一个异常,和我们熟悉的Java中的throw关键字

  • 常见的Python异常及处理方法总结

    目录 一.错误与异常 1.什么是错误 2.什么是异常 3.回溯信息 二.常见异常 常见异常类 三.异常处理 1.异常处理 2.简单的异常处理格式 3.执行顺序 4.except分支可以有多个 5.执行顺序 6.else子句:没有发生异常时执行 7.finally子句:不管异常有没有发生都执行 8.异常嵌套 9.异常处理注意事项与建议 10.在函数中,需要注意在try/except/finally使用return 11.关于性能 四.课后小练习 总结 一.错误与异常 1.什么是错误 (1)语法错误

  • Python中异常处理用法

    目录 1.if进行处理,在错误发生之前进行预防 2.用try..except:在错误发生之后进行处理 为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理, 1.if进行处理,在错误发生之前进行预防 如果错误发生的条件是可预知的,我们需要用if进行处理,在错误发生之前进行预防 AGE=10 while True: age=input('>>: ').strip() if age.isdigit(): #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是

  • Python同时处理多个异常的方法

    问题 你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢? 解决方案 如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示: try: client_obj.get_url(url) except (URLError, ValueError, SocketTimeout): client_obj.remove_url(url) 在这个例子中,元祖中任何一个异常发生时都会执行 remove_url() 方法. 如果你想对其中某个异常进行

  • Python学习之异常处理详解

    目录 什么是异常与异常处理 异常的语法 捕获通用异常 捕获具体异常 如何捕获多个异常 捕获多个异常-方法1 捕获多个异常-方法2 本章节主要学习 python 中的异常处理,来看一下该章节的内容有哪些.首先我们需要了解 什么是异常与异常的处理 ,然后再继续 异常的语法结构 什么是异常与异常处理 异常 —> 可以理解为不同寻常. 正常情况下,我们的程序是自上而下的逐行执行,执行到最后一行才会终止程序的执行.而异常的情况会导致我们的程序半途而废停止了执行.一般情况下的停止执行都是因为我们的程序出错而

  • python学习 流程控制语句详解

    ###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的运行方向 # Ture:表示非空的量(String,tuple元组 .list.set.dictonary),所有非零的数字 # False:0,None .空的量 #逻辑表达式 可以包含 逻辑运算符 and or not if: ##################################

  • Python学习之自定义异常详解

    目录 自定义抛出异常关键字-raise 演示小案例-1 演示小案例-2 自定义异常类 总结 在上一章我们学习了 异常的三个关键字,分别是try.except 以及 finally.我们知道在 try 代码块中如果遇到错误就会抛出异常,交给 except 提前定义好的错误类型进行匹配并捕获,如果成功捕获到异常就会交给 except 的代码块进行执行,最后的 finally 是无论如何都会执行的代码块. 那么在 try 语法块中是谁抛出的异常?优势如何抛出的呢?首先抛出异常的是 Python 的解释

  • Python学习之迭代器详解

    目录 什么是迭代器 如何生成迭代器 迭代器函数 - iter() 函数 与 next() 函数 可迭代的对象 生成迭代器 迭代器的用法 - 演示案例 什么是迭代器 迭代是 python 中访问集合元素的一种非常强大的一种方式.迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源.迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完.迭代器有两个方法:iter()和 next()方法. 这么解释可能不太直观,我们以生活

  • Python学习笔记嵌套循环详解

    目录 1. 嵌套循环 2. break语句 3. continue语句 4. else语句 5. 循环代码优化 1. 嵌套循环 多重循环 代码测试1: # 嵌套循环 def test(): for i in range(5): for j in range(6): print(f"{i} ", end='') print('') # 换行 # Main if __name__ == '__main__': test() 代码测试2: # 九九乘法表 def test2(): for i

  • Python深度学习线性代数示例详解

    目录 标量 向量 长度.维度和形状 矩阵 张量 张量算法的基本性质 降维 点积 矩阵-矩阵乘法 范数 标量 标量由普通小写字母表示(例如,x.y和z).我们用 R \mathbb{R} R表示所有(连续)实数标量的空间. 标量由只有一个元素的张量表示.下面代码,我们实例化了两个标量,并使用它们执行一些熟悉的算数运算,即加法.乘法.除法和指数. import torch x = torch.tensor([3.0]) y = torch.tensor([2.0]) x + y, x * y, x

  • Python的语言类型(详解)

    Python 是强类型的动态脚本语言 . 强类型:不允许不同类型相加 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候 脚本语言:一般也是解释型语言,运行代码只需要一个解释器,不需要编译 强类型语言和弱类型语言 1.强类型语言:使之强制数据类型定义的语言.没有强制类型转化前,不允许两种不同类型的变量相互操作.强类型定义语言是类型安全的语言,如Java.C# 和 python,比如Java中"int i = 0.0;"是无法通过编译的: 2.弱类型语言:数据类型

  • Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 这次要爬的站点是这个:http://www.weather.com.cn/forecast/ 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 首先来到目标数据的网页 http://www.weather.com.cn/weather40d/101280701.shtml 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化. 这是因为网页前端使用

  • Python模块WSGI使用详解

    WSGI(Web Server Gateway Interface):Web服务网关接口,是Python中定义的服务器程序和应用程序之间的接口. Web程序开发中,一般分为服务器程序和应用程序.服务器程序负责对socket服务的数据进行封装和整理,而应用程序则负责对Web请求进行逻辑处理. Web应用本质上也是一个socket服务器,用户的浏览器就是一个socket客户端. 我们先用socket编程实现一个简单的Web服务器: import socket def handle_request(c

  • python tkinter组件使用详解

    这篇文章主要介绍了python tkinter组件使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.按钮 # 按钮 # bg设置背景色 btn = tkinter.Button(root,text = '按钮',bg = 'red') btn.pack() # fg设置前景色(文字颜色) btn1 = tkinter.Button(root,text = '按钮',fg = 'blue') btn1.pack() # font设置字体

随机推荐