如何在Python中处理异常

在程序执行过程中遇到错误是很常见的。 您可能需要处理的两种常见错误是语法错误和异常。 错误键入代码时,会发生语法错误。 在这种情况下,解析器会重复错误行,并使用箭头指向最早检测到错误的位置。

异常与语法错误不同。 它们在程序执行期间发生意外情况。 例如,假设您要用户输入数字以执行除法。 现在,如果用户输入的是字符串而不是数字,并且您尝试将数字除以给定的输入,则程序将输出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块中执行代码后,将再次引发相同的异常。

一个更复杂的例子

在本节中,我们将编写一个程序来处理多个异常。 就像前面的示例一样,我们将执行一些数学运算。 但是,这次我们将从列表中获取输入。

以下代码检查两个异常TypeErrorValueErrorelse块用于打印阶乘。 您可以在输出中看到仅在未引发异常时才执行此代码。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值