在程序执行过程中遇到错误是很常见的。 您可能需要处理的两种常见错误是语法错误和异常。 错误键入代码时,会发生语法错误。 在这种情况下,解析器会重复错误行,并使用箭头指向最早检测到错误的位置。
异常与语法错误不同。 它们在程序执行期间发生意外情况。 例如,假设您要用户输入数字以执行除法。 现在,如果用户输入的是字符串而不是数字,并且您尝试将数字除以给定的输入,则程序将输出TypeError
。
当您没有正确处理异常时,程序将突然退出,因为它不知道在这种情况下该怎么办。 以下代码就是这样的示例:
keep_asking = True
while keep_asking:
x = int(input("Enter a number: "))
print("Dividing 50 by", x,"will give you :", 50/x)
只要输入整数输入值,程序就可以正常运行。 但是,只要输入一个字符串甚至十进制数字作为输入,就会出现ValueError
异常。
在本教程中,您将学习如何在Python中正确处理和引发异常。
一些常见的例外
这是编写程序时可能会遇到的一些基本例外。 您可以在官方网站上了解更多内置的例外 。
- NameError :当程序找不到本地或全局名称时,引发此异常。 错误消息中包含找不到的名称。
- TypeError :向函数传递不合适类型的对象作为参数时, 引发此异常。 错误消息中提供了有关错误类型的更多详细信息。
- ValueError :当函数参数的类型正确但值不合适时,将发生此异常。
- NotImplementedError :当对象应该支持某个操作但尚未实现时,引发此异常。 当给定函数不支持输入参数的类型时,不应使用此错误。 在这些情况下,引发
TypeError
异常更为合适。 - ZeroDivisionError :当您为除法或模运算提供第二个参数为零时,引发此异常。
- FileNotFoundError :当程序请求的文件或目录不存在时,引发此异常。
就像上面的名字一样,大多数例外都有不言自明的名字。
处理异常
本文开头的代码要求用户输入一个整数作为输入。 如果用户未提供整数输入,则程序将停止执行并引发值错误异常。 在本节中,我们将编写一些代码来告诉用户,他们的输入不是有效的整数值。
该过程的第一步是将您认为可能引发异常的代码包含在try
子句中。 下一步是使用except
关键字来处理以上代码中发生的异常。 用户输入的修改后的代码如下所示:
keep_asking = True
while keep_asking:
try:
x = int(input("Please enter a number: "))
print("Dividing 50 by", x,"will give you :", 50/x)
except ValueError:
print("The input was not an integer. Please try again...")
此处发生的是程序试图执行try
子句中的代码。 如果没有引发异常,则程序将跳过except
子句,其余代码将正常执行。 如果引发异常,则程序将跳过try
子句中的其余代码,并且该异常的类型与except
关键字之后的异常名称匹配。 如果匹配,则首先执行except
子句中的代码,然后正常执行try
子句后的其余代码。
输入整数作为输入时,程序将为您提供除法的最终结果。 当提供非整数值时,程序将打印一条消息,要求您尝试再次输入一个整数。 请注意,这次,当您提供一些无效的输入时,程序不会突然退出。
您可以具有多个except
子句来处理不同的异常。 请记住,这些处理程序将仅处理在相应的try
子句中发生的异常。 他们将不处理其他异常处理程序中引发的任何异常。
您也可以使用单个except
子句来处理多个异常,方法是将这些异常作为tuple
传递给子句。
except (ZeroDivisionError, ValueError, TypeError):
print("Something has gone wrong..")
# code to deal with the exception
最后,您还可以在except
关键字之后省略异常的名称。 通常不建议这样做,因为代码现在将捕获所有异常并以相同方式处理它们。 这不是最佳选择,因为您将以与处理ZeroDivisionError
异常相同的方式来处理TypeError
异常。 处理异常时,最好尽可能具体一些,只捕获您可以处理的内容。
捕获所有异常的一种可能用途是在屏幕上正确打印出异常错误,如以下代码所示:
import math
import sys
try:
result = math.factorial(2.4)
except:
print("Something Unexpected has happened.",sys.exc_info()[0])
else:
print("The factorial is", result)
使用其他条款
您也可以在try ... except
语句中使用else
子句。 else
子句旨在包含在try
子句未引发任何异常的情况下需要执行的代码。 这对于确保您不向您不想捕获异常的try
块中添加任何代码很有用。 值得一提的是,如果您决定使用else
子句,则应在所有except
子句之后但在finally
块之前包括它。
在我们的例子中,我们可以将打印出除法结果的行移到else
块中。
keep_asking = True
while keep_asking:
try:
x = int(input("Please enter a number: "))
except ValueError:
print("The input was not a valid integer. Please try again...")
else:
print("Dividing 50 by", x,"will give you :", 50/x)
使用最后条款进行清理
假设您已经在try
块中编写了一些代码,该代码应该通过利用大量资源来执行任务。 在使用完这些资源后,将它们释放回来很重要。 这可以通过使用finally
子句轻松实现。
无论try
块是否引发异常,始终都会执行finally
子句中的代码。 您可以通过运行以下代码来验证这一点:
keep_asking = True
while keep_asking:
try:
x = int(input("Please enter a number: "))
except ValueError:
print("The input was not a valid integer. Please try again...")
else:
print("Dividing 50 by", x,"will give you :", 50/x)
finally:
print("Already did everything necessary.")
如果您指定的任何except
子句均未处理引发的异常,则在finally
块中执行代码后,将再次引发相同的异常。
一个更复杂的例子
在本节中,我们将编写一个程序来处理多个异常。 就像前面的示例一样,我们将执行一些数学运算。 但是,这次我们将从列表中获取输入。
以下代码检查两个异常TypeError
和ValueError
。 else
块用于打印阶乘。 您可以在输出中看到仅在未引发异常时才执行此代码。
import math
number_list = [10,-5,1.2,'apple']
for number in number_list:
try:
number_factorial = math.factorial(number)
except TypeError:
print("Factorial is not supported for given input type.")
except ValueError:
print("Factorial only accepts positive integer values.", number," is not a positive integer.")
else:
print("The factorial of",number,"is", number_factorial)
finally:
print("Release any resources in use.")
上面的代码产生以下输出:
The factorial of 10 is 3628800
Releasing any resources in use.
Factorial only accepts positive integer values. -5 is not a positive integer.
Releasing any resources in use.
Factorial only accepts positive integer values. 1.2 is not a positive integer.
Releasing any resources in use.
Factorial is not supported for given input type.
Releasing any resources in use.
值得注意的另一件事是, finally
子句中的代码针对列表中的每个项目执行。
最后的想法
我希望本教程可以帮助您了解Python中的异常处理。 此外,不要犹豫,看看我们在市场上有哪些可供出售和研究的东西 ,也不要犹豫,使用下面的提要来问任何问题并提供宝贵的反馈。
在无法接收到意外输入后退出程序的情况下,正确处理异常可能会非常有帮助。 如果您对Python中的异常处理有任何疑问,请在评论中告诉我。
学习Python
无论您是刚刚起步还是想学习新技能的经验丰富的程序员,都可以通过我们完整的python教程指南学习Python。
翻译自: https://code.tutsplus.com/tutorials/how-to-handle-exceptions-in-python--cms-28621