python基础_第八章_异常
程序员文章站
2022-06-15 22:46:33
...
异常
1 异常是什么
Python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)。
>>> 1 / 0
Traceback (most recent call last): #这个就是异常
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
2 运用异常
raise 语句
要引发异常,可使用 raise 语句,并将一个类(必须是 Exception 的子类)或实例作为参数。将类作为参数时,将自动创建一个实例。下面的示例使用的是内置异常类 Exception :
>>> raise Exception
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Exception: hyperdrive overload
自定义的异常类
就像创建其他类一样,但务必直接或间接地继承 Exception (这意味着从任何内置异常类派生都可以)。因此,自定义异常类的代码类似于下面这样:
class SomeCustomException(Exception): pass
3 捕获异常
可使用try / except 语句。假设你创建了一个程序,让用户输入两个数,再将它们相除,如下所示:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
Enter the first number: 10
Enter the second number: 0
Traceback (most recent call last):
File "exceptions.py", line 3, in ?
print(x / y)
ZeroDivisionError: integer division or modulo by zero#发生分母为0的异常
为捕获这种异常并对错误进行处理,可像下面这样重写这个程序:
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!")
多个 except 子句
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!")
except TypeError:
print("That wasn't a number, was it?")
如果要使用一个 except 子句捕获多种异常,可在一个元组中指定这些异常,如下所示:
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 ...')
捕获对象
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)
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 Exception as e:
print('Invalid input:', e)
print('Please try again')
else:
break
下面是这个程序的运行情况:
Enter the first number: 1
Enter the second number: 0
Invalid input: integer division or modulo by zero
Please try again
Enter the first number: 'x' Enter the second number: 'y'
Invalid input: unsupported operand type(s) for /: 'str' and 'str'
Please try again
Enter the first number: quuux
Invalid input: name 'quuux' is not defined
Please try again
Enter the first number: 10
Enter the second number: 2
x / y is 5
finally
finally 子句,可用于在发生异常时执行清理工作。这个子句是与 try 子句配套的。无论发生什么的都会执行finally
x = None
try:
x = 1 / 0
finally:
print('Cleaning up ...')
del x
4 异常和函数
异常和函数有着天然的联系。如果不处理函数中引发的异常,它将向上传播到调用函数的地方。如果在那里也未得到处理,异常将继续传播,直至到达主程序(全局作用域)。如果主程序中也没有异常处理程序,程序将终止并显示栈跟踪消息。
5 警告
如果你只想发出警告,指出情况偏离了正轨,可使用模块 warnings 中的函数 warn 。
>>> from warnings import warn
>>> warn("I've got a bad feeling about this.")
__main__:1: UserWarning: I've got a bad feeling about this.
>>>
上一篇: 第八章 异常
下一篇: 获取本周本年本月时间