异常

raise Exception
raise Exception('jobbofhe')
raise ArithmeticError

内置异常类

  • Exception
    几 乎所有的异常类都是从它派生而来的
  • AttributeError
    引用属性或给它赋值失败时引发
  • OSError
    操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
  • IndexError
    使用序列中不存在的索引时引发,为 LookupError 的子类
  • KeyError
    使用映射中不存在的键时引发,为 LookupError 的子类
  • NameError
    找不到名称(变量)时引发
  • SyntaxError
    代码不正确时引发
  • TypeError
    将内置操作或函数用于类型不正确的对象时引发
  • ValueError
    将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
  • ZeroDivisionError
    在除法或求模运算的第二个参数为零时引发

捕获异常

try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except ZeroDivisionError:
    print("The second number can't be zero!")
  • 在上述代码中,如果用户输入字符串、其他非数字值或输入的第二个数为零,都将打印同样的错误消息。
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except (ZeroDivisionError, TypeError, NameError):
    print('Your numbers were bogus ...')
  • 要在 except 子句中访问异常对象本身,可使用两个而不是一个参数。(请注意,即便是在你捕获多个异常时,也只向 except 提供了一个参数——一个元组。)
  • 在这个小程序中, except 子句也捕获两种异常,但由于你同时显式地捕获了对象本身,因此可将其打印出来,让用户知道发生了什么情况。
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except (ZeroDivisionError, TypeError) as e:
    print(e)
  • 上述异常处理均有漏网之鱼
    以下处理方式可以一网打尽,所有的异常情况
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except:
    print('Something wrong happened ...')

#- 在这里,仅当没有引发异常时,才会跳出循环(这是由 else 子句中的 break 语句实现的)。换而言之,只要出现错误,程序就会要求用户提供新的输入。

while True:
    try:
        x = int(input('Enter the first number: '))
        y = int(input('Enter the second number: '))
        value = x / y
        print('x / y is', value)
    except:
        print('Invalid input. Please try again.')
    else:
        break
  • finally 语句
    还有 finally 子句,可用于在发生异常时执行清理工作。这个子句是与 try 子句配套的。
x = None
try:
    x = 1 / 0
finally:
    print('Cleaning up ...')
    del x
# try:
#     1 / 0
# except NameError:
#     print("Unknown variable")
# else:
#     print("That went well!")
# finally:
#     print("Cleaning up.")

异常总结

  • 异常对象:异常情况(如发生错误)是用异常对象表示的。对于异常情况,有多种处理方式;如果忽略,将导致程序终止。
  • 引发异常:可使用 raise 语句来引发异常。它将一个异常类或异常实例作为参数,但你也可提供两个参数(异常和错误消息)。如果在 except 子句中调用 raise 时没有提供任何参数,它将重新引发该子句捕获的异常。
  • 自定义的异常类:你可通过从 Exception 派生来创建自定义的异常。
  • 捕获异常:要捕获异常,可在 try 语句中使用 except 子句。在 except 子句中,如果没有指定异常类,将捕获所有的异常。你可指定多个异常类,方法是将它们放在元组中。如果向 except 提供两个参数,第二个参数将关联到异常对象。在同一条 try / except 语句中,包含多个 except 子句,以便对不同的异常采取不同的措施。
  • else 子句:除 except 子句外,你还可使用 else 子句,它在主 try 块没有引发异常时执行。
  • finally :要确保代码块(如清理代码)无论是否引发异常都将执行,可使用 try / finally ,并将代码块放在 finally 子句中。
  • 异常和函数:在函数中引发异常时,异常将传播到调用函数的地方(对方法来说亦如此)。
  • 警告:警告类似于异常,但(通常)只打印一条错误消息。你可指定警告类别,它们是Warning 的子类。