常用异常
- Exception 几乎所有的异常类都是从它派生而来的
- AttributeError 引用属性或给它赋值失败时引发
- OSError 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
- IndexError 使用序列中不存在的索引时引发,为LookupError的子类
- KeyError 使用映射中不存在的键时引发,为LookupError的子类
- NameError 找不到名称(变量)时引发
- SyntaxError 代码不正确时引发
- TypeError 将内置操作或函数用于类型不正确的对象时引发
- ValueError 将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
- ZeroDivisionError 在除法或求模运算的第二个参数为零时引发
自定义异常类
class SomeCustomException(Exception): pass
异常捕获
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!")
raise
将一个类(必须是Exception的子类)或实例作为参数。将类作为参数时,将自动创建一个实例
不提供参数
在与用户交互的会话中,抑制异常很有用;但在程序内部使用时,引发异常是更佳的选择
class MuffledCalculator:
muffled = False
def calc(self, expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print('Division by zero is illegal')
else:
raise
>>> calculator.muffled = True
>>> calculator.calc('10 / 0')
Division by zero is illegal
多个错误处理
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?")
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)
//除Exception外还有SystemExit和KeyboardInterrupt
try:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
except:
print('Something wrong happened ...')
finally
//在发生异常时执行清理工作,
try:
1 / 0
except NameError:
print("Unknown variable")
else:
print("That went well!")
finally:
print("Cleaning up.")
案例
//异常
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
def describe_person(person):
print('Description of', person['name'])
print('Age:', person['age'])
if 'occupation' in person:
print('Occupation:', person['occupation'])
def describe_person(person):
print('Description of', person['name'])
print('Age:', person['age'])
try:
print('Occupation:', person['occupation'])
except KeyError: pass
try:
obj.write
except AttributeError:
print('The object is not writeable')
else:
print('The object is writeable')
//警告
>>> from warnings import filterwarnings
>>> filterwarnings("ignore")
>>> warn("Anyone out there?")
>>> filterwarnings("error")
>>> warn("Something is very wrong!")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UserWarning: Something is very wrong!