大家好,欢迎来到IT知识分享网。
我们在运行程序的时候,即使我们的逻辑和语法都是正确的,有时候也会因为用户的输入错误或其他的不一致导致会出现一些exception例外,这就需要我们来处理这些exception,以使得程序可以顺畅优雅的运行下去。
在本篇文章中,我主要想分享try except语句的一般使用语法,然后处理简单的代码例子,讨论下会出现什么错误,提供正确的使用try except的方法。
try except的语法块格式
我们先来理解python中try except语句的语法。一般的格式如下:
try:
#这里执行我们想要执行的代码
except <error type>:
#在这里处理上面try的代码运行产生的错误
#如果try内代码执行出现错误,这里的代码将运行
else:
#如果try代码执行顺利,没有出现错误
#将会执行这里的代码
finally:
#无论是否出现错误,这里的代码都会执行
- try块 你想要执行的代码放到try里面,由于exception,运行时可能会出现错误。我们可以遇见到这里可能会出现的错误或exception
- except块,在try执行代码出现错误时执行。包含一系列的信息,给我们一些上下文的提示,大概是哪一部分出了问题,出现了什么类型的问题。
- 在except中你应该一直都指明你想要处理的错误类型。
- 你也可能会不指定错误的类型,但在实践中不推荐这么做。你不可能罗列出所有可能发生的所有错误。
- 执行try块代码时,可能会出现多个错误类型。你需要尽可能多地用except语句罗列出每一个你能想到的错误。
- else块只有在try执行没有出现错误时才触发。在try执行完后,如果你有后续的操作需要执行时会比较有用。比如你在try中打开了一个文件,在else中你可能会需要读取它的内容。
- finally块永远都会执行,无论是否出现错误。如果代码执行完后,你想释放一些资源时会有用。
- else和finally块是可选的。大多数情况下你可以只用try来执行代码,用except来处理exception.
下面我们举几个例子来学习一下python中如何处理exceptions。
python处理ZeroDivisionError
下面的代码时一个除法的函数
def divide(num,div):
return num/div
调用这个函数可以得到预期的结果
res = divide(100,8)
print(res)
# 输出
12.5
res = divide(568,64)
print(res)
# 输出
8.875
当用下面的方法调用函数时就会出现错误
divide(27,0)
程序会出错,并提示出现一个ZeroDivisionError的错误
ZeroDivisionError Traceback (most recent call last)
<ipython-input-19-932ea024ce43> in <module>()
----> 1 divide(27,0)
<ipython-input-1-c98670fd7a12> in divide(num, div)
1 def divide(num,div):
----> 2 return num/div
ZeroDivisionError: division by zero
你可以用下面的方法来处理这个错误:
- 在try里面,调用函数divide,基本上就是想用num除div
- 在except里面,处理div等于0的情况
- 在这个例子中,你可以打印出一个提示信息给用户
try:
res = divide(num,div)
print(res)
except ZeroDivisionError:
print("您在尝试用一个数去除以0....")
如果输入正确,函数仍然可以正常得到结果:
divide(10,2)
# 输出
5.0
如果尝试除以0,将会收到提示有错误发生,程序会很顺畅地结束。
divide(10,0)
# 输出
您在尝试用一个数去除以0....
python处理TypeError的exception
在这个部分,我分享一下如何在python中使用try except语句来处理Type Error
下面的函数代码接收一个数字作为参数,加10后返回结果
def add_10(num):
return num + 10
你可以传入任何数字作为参数给这个函数,都可以正常返回结果
result = add_10(89)
print(result)
#输出
99
现在如果试着用”5″代替5:
add_10("5")
你将会看到程序终止,并出现下面的错误
TypeError Traceback (most recent call last)
<ipython-input-15-9844e949c84e> in <module>()
----> 1 add_10("five")
<ipython-input-13-2e506d74d919> in add_10(num)
1 def add_10(num):
----> 2 return num + 10
TypeError: can only concatenate str (not "int") to str
错误提示你:数字和字符串不能进行运算或连接
可以采用这个方法来处理:
- 定义一个数字,在try中调用函数add_10,把定义的变量作为参数,如果参数是有效的类型,则正常返回结果
- 否则,except中的TypeError触发,提示用户参数的类型错误
my_num = "five"
try:
result = add_10(my_num)
print(result)
except TypeError:
print("参数必须时一个数字类型")
因为现在我们已经对TypeError进行了处理,现在只是会收到一个提示
参数必须时一个数字类型
python处理IndexError
如果你以前跟python的列表list打过交道,你可能已经碰到过IndexError。因为跟踪记录list的item变化是有困难的,你可能会尝试访问一个无效的list的index.
在这个例子里,列表my_list有四个item。有效的index为0,1,2,3。如果你使用负指数的话,有效的index为-1,-2,-3,-4.
2为有效的index,所以我们可以看到2上的项,也就是c++被打印出来。
my_list = ["Python","C","C++","JavaScript"]
print(my_list[2])
#输出
C++
如果你访问超出范围的index,将会碰到IndexError错误
print(my_list[4])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-7-437bc6501dea> in <module>()
1 my_list = ["Python","C","C++","JavaScript"]
----> 2 print(my_list[4])
IndexError: list index out of range
如果你已经熟悉了try except的模式的话,你就会使用这个语句来处理相关的错误
在下面的代码中,通过search_idx来访问列表内的项。
search_idx = 3
try:
print(my_list[search_idx])
except IndexError:
print("对不起,访问的index超出范围")
因为3为有效的index,所以指定的项目是可以正确的打印出来的
JavaScript
如果search_idx在有效的index范围之外,except会捕捉到IndexError,不会出现一大串的错误信息,而是显示我们自定义的提示信息。
对不起,访问的index超出范围
python处理KeyError
在处理python的dictionary数据类型时,你可能已经遇到过KeyError
如下的例子为my_dict.
my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
search_key = "non-existent key"
print(my_dict[search_key])
- dictionary my_dict有三个键值对,”key1″:”value1″,”key2″:”value2″,”key3″:”value3″
- 现在,你尝试访问的是my_dict的键”non-existent key”
所以,你会碰到这个KeyError错误
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-2-2a61d404be04> in <module>()
1 my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
2 search_key = "non-existent key"
----> 3 my_dict[search_key]
KeyError: 'non-existent key'
你可以按照处理IndexError的方法来处理KeyError
- 尝试访问my_dict中的search_key
- 如果search_key是有效的,则相应地值被输出
- 如果由于访问不存在的键,使用except来提示用户
try:
print(my_dict[search_key])
except KeyError:
print("对不起,您访问的是一个无效的Key!")
对不起,您访问的是一个无效的Key!
你还可以把捕获到的错误作为error_msg打印出来,作为用户的提示。
try:
print(my_dict[search_key])
except KeyError as error_msg:
print(f"对不起,{error_msg} 不是一个有效的key!")
现在的输出如下:
对不起,‘non-existent key’ 不是一个有效的key!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/13132.html