Python 异常处理

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

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

[En]

In some cases (for example, trying to read a file that does not exist), the program may have a run-time error. Once the program crashes, the user’s mood can be imagined.

当然,作为程序员,我们希望程序足够健壮,即使出现异常也能很好地恢复。因此,当面对这些可预见的问题时,通常需要增加一些安全措施。

[En]

Of course, as programmers, we want the program to be robust enough to recover well even if an exception occurs. Therefore, when faced with these foreseeable problems, it is usually necessary to add some security measures.

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

try/except 子句

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

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

  • A:你的薪水是多少?
  • B:你猜?

这里,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​​ 子句可以指定捕获特定的异常。

来看一段伪代码:

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

else 子句

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

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

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

finally 子句

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

例如,操作一个文件:

使用异常对象

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

[En]

The exception object contains not only the error type, but also some other information.

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

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

运行脚本:

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

一般来说,这种异常信息对用户来说不是很方便–如果你想向用户报告错误,你通常需要写一条更具描述性的消息(表明错误与用户的一些行为有关)。此时,您可以将异常消息与您自己的消息组合在一起:

[En]

In general, this exception information is not very convenient for the user-if you want to report the error to the user, you generally need to write a more descriptive message (indicating that the error is related to some of the user’s behavior). At this point, you can combine the exception message with your own message:

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

再次运行脚本:

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

抛出异常

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

您还可以选择传递异常的值来解释引发异常的原因:

[En]

You can also choose to pass a value for the exception to explain why the exception was thrown:

薪资肯定是一个正整数,当输入一个负数或 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.

Original: https://blog.51cto.com/waleon/5525600
Author: waleon
Title: Python 异常处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504674/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球