使用
try ... except [else]
来捕获异常,且要求异常必须继承自Exception类。
异常处理
运行期检测到错误称为异常。
try语句
python通过try...except
来处理异常;一个except可捕获多个异常,也可有多个except分支(此时从上到下,执行最先匹配的)。捕获异常时,可获取异常详细信息:
- 使用sys模块中的exc_info方法;
- 使用traceback模块中的相关函数。
sys.exc_info取异常的详细信息,返回一个3值元表(type, value, traceback):
- type:捕获到异常的类型名称;
- value:捕获到异常的实例;
- traceback:是一个包含stack traceback的对象;可通过traceback 模块打印:
traceback.print_exc()
:直接打印当前异常信息;traceback.print_tb(sys.exc_info()[2])
:打印traceback对象信息;traceback.print_exception(*sys.exc_info())
:直接打印元素;
import traceback
try:
pass
except (RuntimeError, TypeError, NameError):
pass
except Exception as e:
traceback.print_tb(sys.exc_info()[2])
pass
else:
pass
finally:
pass
也可忽略异常类型,此时匹配所有异常(相当于BaseException),包括键盘中断和程序退出(此时用sys.exit()
就无法退出程序了),一般不要使用此方式,而是用Exception:
try:
pass
except:
pass
异常信息
在except中,通过as把异常信息赋给变量,然后通过str或repr获取异常的信息;
try:
num = 1/0
except Exception as ex:
print(str(ex))
print(repr(ex))
抛出异常
assert(断言)语句可用于判断一个表达式,在表达式条件为假的时候触发异常。
assert expression
通过raise来抛出指定的异常:
raise [exceptionName [(reason)]]
- raise:在正常代码中单独一个raise引发RuntimeError异常;若在except模块中,则是重新抛出异常;
- raise异常类名称:引发指定类型异常。
- raise异常类名称(描述信息):引发带描述信息的指定类型异常。
异常类型
自定义异常
异常类需继承自Exception类(可直接继承或间接继承)。
class MyError(Exception):
pass
class MsgError(MyError):
def __init__(self, expression, message):
self.expression = expression
self.message = message
预定义异常
BaseException是所有异常的基类,所有预定义异常都继承自BaseException。所有内置的非系统退出类异常都派生自Exception;所有用户自定义异常也应派生自此类。
BaseException
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ExceptionGroup [BaseExceptionGroup]
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
│ ├── UnicodeDecodeError
│ ├── UnicodeEncodeError
│ └── UnicodeTranslateError
└── Warning
├── BytesWarning
├── DeprecationWarning
├── EncodingWarning
├── FutureWarning
├── ImportWarning
├── PendingDeprecationWarning
├── ResourceWarning
├── RuntimeWarning
├── SyntaxWarning
├── UnicodeWarning
└── UserWarning
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)