Python中有两种错误:语法错误(SyntaxError)和异常。
assert(断言)用于判断一个表达式,在表达式条件为false时触发异常。
异常处理
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如:
except (RuntimeError,TypeError,NameError):
pass
抛出异常 raise:
raise语句有三种常用的用法:
(1)raise:引发当前上下文中捕获的异常(在except块中),或默认引发RuntimeError;
(2)raise 异常类名称:引发该类型的异常;
(3)raise 异常类名称(描述信息):引发指定类型异常的同时,附带异常的描述信息。
>>> raise
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数为0异常")
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
raise ZeroDivisionError("除数为0异常")
ZeroDivisionError: 除数为0异常
raise语句引发的一场通常使用try-except异常处理结构来捕获并处理。
try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))
# output:
# 输入一个数:a
# 引发异常: ValueError('a 必须是数字')
自定义异常
Python的异常继承树:
Python中的异常有一个基类BaseException,然后继承的是Exception,我们的自定义类也必须继承Exception,可以直接继承,也可以间接继承。
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print("My exception occurred, value:", e.value)
#output:
# My exception occurred, value: 4
我们定义异常类时,类名通常以“Error”结尾,与标准的异常一样。
当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:
class Error(Exception):
"""Base class for exceptions in this module."""
pass
class InputError(Error):
"""Exception raised for errors in the input.
Attributes:
expression -- input expression in which the error occurred
message -- explanation of the error
"""
def __init__(self, expression, message):
self.expression = expression
self.message = message
class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.
Attributes:
previous -- state at beginning of transition
next -- attempted new state
message -- explanation of why the specific transition is not allowed
"""
def __init__(self, previous, next, message):
self.previous = previous
self.next = next
self.message = message
定义清理行为
try 语句还有另外一个可选的子句,它定义了无论在任何情况下都会执行的清理行为。 例如:
try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
Goodbye, world!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
如果一个异常在try子句里(或者在except和else子句里)被抛出,而没有任何的except把它捕获,那么这个异常会在finally子句执行后抛出。
转载:https://blog.csdn.net/weixin_43660661/article/details/105889181