📜  Python | 异常处理

📅  最后修改于: 2020-04-08 08:40:43             🧑  作者: Mango

到目前为止,我们已经探索了基本的Python 。
如果您是初学者,那么到目前为止您可能会获得大量的新问题。由于运行时错误而生成了回溯。
像其他语言一样,Python还在try-except的帮助下通过异常处理方法提供了运行时错误。一些最常见的标准异常包括IndexError,ImportError,IOError,ZeroDivisionError,TypeError。
异常是Python中所有异常的基类。您可以在此处检查异常层次结构。
让我们尝试访问索引超出范围的数组元素并处理相应的异常。

# Python程序处理简单的运行时错误
a = [1, 2, 3]
try:
    print "第二个元素 = %d" %(a[1])
    # 抛出错误,因为数组中只有3个元素
    print "第四个元素 = %d" %(a[3])
except IndexError:
    print "发生错误"

输出:

第二个元素 = 2
发生错误

一个try语句可以具有一个以上的except子句,以指定不同异常的处理程序。请注意,最多将执行一个处理程序。

# 程序用一个except语句处理多个错误
try :
    a = 3
    if a < 4 :
        # 抛出异常ZeroDivisionError,对于a = 3
        b = a/(a-3)
    # 抛出NameError 如果 a >= 4
    print "b的值 = ", b
# 请注意,对于多个异常,此处需要大括号()
except(ZeroDivisionError, NameError):
    print "\n发生和处理的错误"

输出:

发生和处理的错误

如果将“ a”的值更改为大于或等于4,则输出为

b的值 =
发生和处理的错误

上面的输出是因为Python一旦尝试访问b的值,就会发生NameError。

在Python中,您还可以在try-except块上使用else子句,该子句必须出现在所有except子句之后。仅当try子句未引发异常时,代码才进入else块。

# Program在try-except块上使用else子句
# 函数返回a/b
def AbyB(a , b):
    try:
        c = ((a+b) / (a-b))
    except ZeroDivisionError:
        print "a/b 结果是 0"
    else:
        print c
# 测试代码
AbyB(2.0, 3.0)
AbyB(3.0, 3.0)

上面程序的输出将是:

-5.0
a/b 结果是 0

引发异常: raise语句允许程序员强制发生特定的异常。raise中唯一的参数表示要引发的异常。这必须是异常实例或异常类(从Exception派生的类)。

# 展示raise引发异常
try:
    raise NameError("你好")  # 引发异常
except NameError:
    print "一个异常"
    raise  # 确定是否引发异常

上面代码的输出将简单地打印为“异常”,但是由于最后一行中的raise语句,最后也会发生运行时错误。因此,命令行上的输出将如下所示:

Traceback (most recent call last):
  File "003dff3d748c75816b7f849be98b91b8.py", line 4, in 
    raise NameError("Hi there") # Raise Error
NameError: Hi there