try:print("1. try执行了") result = 10 / 0 # 除零错误except ZeroDivisionError:print("2. except执行了(捕获到异常)")else:print("3. else不会执行(因为有异常)")finally:print("4. finally总会执行")# 输出:# 1. try执行了# 2. except执行了(捕获到异常)# 4. finally总会执行
try...except...else...finally流程图:
try...except...else...finally和if...else...区别:if else是提前预判:就像出门前看天气预报,如果下雨(条件为真)就带伞,否则不带。它处理的是可预见的、能提前判断的逻辑分支。try except是事后容错:就像出门没看天气预报,下雨了(发生异常)就临时找避雨的地方,没下雨就正常走。它处理的是无法提前预判(或预判成本极高)的意外情况。
Python 中的所有异常本质上都是类(Class),except 关键字后面必须跟这个类(或它的实例),而不是普通的字符串 / 变量名:
- 内置异常(如
ValueError、ZeroDivisionError)是 Python 预定义的异常类,所以可以直接用;
- 自定义异常需要你先定义一个继承自
Exception 的类,才能在 except 中使用。
所有的错误类型都继承自 BaseException
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 │ ├── PythonFinalizationError │ └── 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
假如需要输入一个有效的数字,程序才能执行,因该怎么写?while True: try: num = int(input("请输入一个除数:")) result = 10 / numprint(f"结果是:{result}")break# 没有异常才跳出循环 except ZeroDivisionError:print("除数不能为0,请重新输入!") except ValueError:print("请输入有效的整数!")