python中异常处理的两种方式,介绍一下python的异常处理机制
一般情况下,我们的程序是自上而下逐行执行的,直到最后一行程序的执行才会终止。而异常情况会导致我们的程序中途停止执行。本文将通过实例详细讲解Python中的异常处理,有兴趣的可以学习一下。
目录
什么是异常和异常处理?一般异常的语法捕获?具体例外?如何捕获多个异常?-方法1:捕获多个异常?-方法二:本章主要研究python中的异常处理。让我们来看看这一章的内容。首先我们要知道什么是异常和异常处理,然后继续异常的语法结构。
什么是异常与异常处理
异常—可以理解为不寻常。
一般情况下,我们的程序是自上而下逐行执行的,直到最后一行程序的执行才会终止。而异常情况会导致我们的程序中途停止执行。一般来说,停止执行是由我们的程序的错误引起的,而异常是一个错误。异常的发生将导致我们的程序崩溃并停止运行。这在我们的工作中是非常不友好的!
在程序的整个生命周期中,不能保证程序不会出错。所以当我们遇到错误时,为了不影响程序的执行,我们需要处理这些异常。Python中的异常机制可以监控和捕捉异常。当程序出现错误时,对异常进行临时而妥善的处理可以使程序继续正常运行。
总结:
反常的本质是错误。
该异常将导致程序崩溃并停止执行。
监控和捕捉异常,并对引起异常的程序进行适当的处理,使程序能够继续正常运行。
接下来,让我们快速看一下如何捕捉异常并处理它们的语法。
异常的语法
Try: #异常关键字,意为尝试
代码块1 #是由try关键字检查和保护的业务代码块。
异常异常类型: #发现异常后的处理关键字后面会跟一个错误类型(异常类型),异常类型可以为空。
在代码块2 # try的代码块中发生错误后,将执行除
#这通常是try代码块中出现错误后的补救逻辑。
看一个简单的例子:
1/0#我们都知道0是不能被整除的,所以产生了下面这个错误。
#执行结果如下
# ZeroDivisionError:被零除
#我们称代码异常抛出的错误报告为。这个报错信息告诉我们为什么报错,业务会被停止。
#在程序中,我们被允许犯错误,但是我们需要捕捉我们可能遇到的异常,
#合理处理,让程序遇到异常时也能合理运行。
看看上面例子中异常的捕获。
尝试:
1/0
例外:
打印(“注意:0不能被1整除”)
Print (ZerodividionError 3360被零除已被捕获,程序继续执行)
#执行结果如下
#注意:0不能被1整除
# zerodivisionerror:被零除已被捕获,程序继续执行。
#虽然try代码块抛出了一个异常,但我们通过except合理地绕过了它,这样我们的程序继续向下执行。
接下来我们用之前学过的知识点upper()函数做一个小案例:
定义一个upper并使用upper()函数。将传入的字符串大写,如果传入的参数不是字符串,则捕获异常并处理它。
定义上限(str_data):
new_str=无
尝试:
new_str=str_data.upper()
例外:
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异常处理内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。