当前位置 : 主页 > 编程语言 > python >

Python 异常处理

来源:互联网 收集:自由互联 发布时间:2022-08-10
简述 异常处理是一门艺术,更是优秀程序员必修之路。 在某些情况下(例如:试图读取一个不存在的文件),程序可能会发生运行时错误。一旦程序崩溃,用户的心情可想而知。。。


简述

异常处理是一门艺术,更是优秀程序员必修之路。

在某些情况下(例如:试图读取一个不存在的文件),程序可能会发生运行时错误。一旦程序崩溃,用户的心情可想而知。。。

当然,作为程序员,我们希望程序足够健壮,即使发生异常,也能够很好地恢复过来。所以,在遇到这些可预见的问题时,通常需要添加一些安全的防护性措施。

| 版权声明:一去、二三里,未经博主允许不得转载。

try/except 子句

在 Python 中,​​try/except​​ 语句用于处理程序执行过程中出现的一些异常情况。

在 ​​try​​​ 子句中,通常放置的是一个可能引发异常的操作,而处理异常的代码则在 ​​except​​ 子句中。

  • A:你的薪水是多少?
  • B:你猜?
try:
salary = int(input("Please enter the salary: "))
print("So happy %d." % salary)
except:
print("It's not a number!")

这里,Python 将尝试处理 ​​try​​​ 块中的所有语句,一旦发生异常(人家打听你工资,你非要说一个 “abc”),则控制流将立即传递到 ​​except​​​ 块,并跳过 ​​try​​ 中的剩余语句。

执行脚本:

Please enter the salary: 10000
So happy 10000.

Please enter the salary: abc
It’s not a number!

注意: 这里,​​except​​ 子句没有捕获特定异常,这并不是一个好的编程习惯。因为它会捕获所有的异常,并以相同的方式处理所有的情况。

捕获特定异常

一个 ​​try​​​ 子句可以有任意数量的 ​​except​​​ 子句,但只有一个将被执行,并且 ​​except​​ 子句可以指定捕获特定的异常。

来看一段伪代码:

try:
# 执行语句
pass

except ValueError:
# 处理 ValueError 异常
pass

except (TypeError, ZeroDivisionError):
# 处理多个异常 - TypeError 和 ZeroDivisionError
pass

except:
# 处理所有其他异常
pass

通过使用元组,可以为 ​​except​​ 子句指定多个异常。

else 子句

通常,如果不发生异常,我们往往会希望执行一些额外的代码,这可以通过 ​​else​​ 子句轻松地实现。

上述示例,我们将 ​​print​​​ 语句直接放在 ​​try​​​ 块中。这时,只有在转换语句不引发异常的情况下才执行该语句,但将其放在 ​​else​​ 块中才是更好的做法。

try:
salary = int(input("Please enter the salary: "))
except ValueError:
print("It's not a number!")
else:
print("So happy %d."

也就是说,​​try​​ 块中唯一的代码应该是有潜在风险的单行(即:要处理的错误的来源)。老实说,大多数人不这样用,但我挺喜欢。

finally 子句

另外,​​try​​​ 语句可以有一个可选的 ​​finally​​ 子句。无论什么情况,该子句都会被执行,通常用于释放外部资源。

例如,操作一个文件:

try:
f = open("ReadMe.txt", encoding = 'utf-8')
# 执行文件操作
finally:
f.close()

一旦使用,无论文件是否打开成功,都必须清理资源。所以,在 ​​finally​​​ 子句中使用 ​​close()​​,可以确保即使发生异常,文件也能够被关闭。

使用异常对象

异常对象包含的信息不仅仅是错误类型,也有一些其他信息。

要访问这些信息,需要能够访问异常对象,可以将其分配给一个变量,然后在 ​​except​​ 子句中使用:

try:
salary = int(input("Please enter the salary: "))
except ValueError as

注意: ​​err​​ 不是字符串,但是 Python 知道如何将它转换为一个异常的字符串表示形式。

运行脚本:

Please enter the salary: abc
invalid literal for int() with base 10: ‘abc’

通常,这些异常信息不是很方便用户 - 如果想向用户报告错误,一般需要编写一个更具描述性的消息(说明错误与用户的某些行为相关)。这时,可以将异常消息与自己的消息相结合:

try:
salary = int(input("Please enter the salary: "))
except ValueError as err:
print("You entered incorrect salary: %s"

注意: 使用 ​​%s​​ 将一个变量插入到格式化的字符串中,也可以将变量转换为字符串。

再次运行脚本:

Please enter the salary: abc
You entered incorrect salary: invalid literal for int() with base 10: ‘abc’

抛出异常

在 Python 中,当发生运行时错误,就会出现相应的异常。此外,也可以使用关键字 ​​raise​​ 来强制引发。

还可以选择为异常传递值,以说明为什么会引发异常:

try:
salary = int(input("Please enter the salary: "))
if salary <= 0:
raise ValueError("%d is not a valid age, salary must be positive." % salary)
except ValueError as err:
print("You entered incorrect salary: %s" % err)
else:
print("So happy %d."

薪资肯定是一个正整数,当输入一个负数或 0 时,我们可以抛出自己的 ​​ValueError​​。

注意: 之所以选择 ​​ValueError​​ 作为我们的异常类型,是因为它最适合这种错误。当然,这里也可以使用一个完全不合适的异常类,但应该尽量保持一致。

当这样做时,它与任何其他异常具有完全相同的效果 - 控制流将立即退出 ​​try​​​ 子句,并传递给 ​​except​​​ 子句。这个 ​​except​​​ 子句也可以匹配我们的异常,因为它也是一个 ​​ValueError​​。

运行脚本:

Please enter the salary: -10000
You entered incorrect salary: -10000 is not a valid age, salary must be positive.


上一篇:Python 文件和目录管理(os)
下一篇:没有了
网友评论