异常
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 的子类。