欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

python基础_第八章_异常
自定义的异常类
就像创建其他类一样,但务必直接或间接地继承 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.
>>>