Exception 和 Error 的区别
python 与 java 不一样,python 的所有异常类,都继承自 BaseException ,并不严格区分 Error 和 Exception。
以 SyntaxError 为例,名字虽然叫 Error,但实际也是继承自 Exception。
java 的规范:
- 将可预知的,而不影响程序执行的,称之为 Exception,比如:参数格式不对;
- 不可预知的、致命的,可能影响到程序自身运行的,称之为 Error,比如:系统内存溢出。
自定义异常和异常捕获
# 自定义异常
class MyCustomException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return self.message
# 多行注释
def pr(a):
try:
if a > 0:
# 抛出自定义异常
raise MyCustomException("这是一个自定义的异常信息")
except MyCustomException as e:
# 异常处理
print(e)
# 重新抛出异常
raise e
else:
# 业务处理代码块
print('done')
finally:
# 必定执行的代码块
print('finally')
pass
pr(0)
pr(1)
不建议捕获的异常
这几个异常比较特殊,与 Exception 是同级关系,直接继承自 BaseException。
- SystemExit异常在解释器请求退出时触发,比如执行sys.exit()。
- KeyboardInterrupt异常在用户按下中断键(通常是Ctrl+C)时触发,用于中断程序的执行。
- GeneratorExit异常在从生成器中调用close()方法或发送EXIT信号时触发,用于清理生成器。
如果尝试捕获这些异常,通常是为了处理它们,这可能会导致意想不到的副作用,因为它们通常表示程序应当立即终止的情况。
如果你确实需要捕获这些异常,并且你清楚自己在做什么,你可以按照以下方式捕获:
import sys
try:
# 触发SystemExit的操作,例如:sys.exit()
sys.exit()
except SystemExit:
print("捕获到SystemExit异常")
# 按下Ctrl+C触发KeyboardInterrupt异常
try:
input("按下Ctrl+C退出:")
except KeyboardInterrupt:
print("捕获到KeyboardInterrupt异常")
# 生成器中发送EXIT信号触发GeneratorExit异常
def gen():
while True:
try:
yield
except GeneratorExit:
print("捕获到GeneratorExit异常")
break
g = gen()
g.close()
继承关系
下面由 AI 生成,可能存在部分错误,使用时需要注意甄别
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- 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
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- EncodingWarning
+-- ResourceWarning
常见的异常
* SyntaxError:当Python解释器发现程序中有语法错误时,会抛出SyntaxError异常。例如,在Python3.X版本中,print函数需要加括号,如果不加括号就会抛出SyntaxError异常。
* NameError:当尝试访问一个未声明的变量时,会引发NameError。例如,如果变量未定义就使用,Python会抛出NameError异常。
* TypeError:当尝试使用不支持的操作类型时,会抛出TypeError异常。例如,将字符串和整数相加会导致TypeError。
* ZeroDivisionError:尝试除以零时,会抛出ZeroDivisionError异常。
* IndexError:尝试访问列表或元组中不存在的元素时,会抛出IndexError异常。
* KeyError:尝试访问字典中不存在的键时,会抛出KeyError异常。
* ValueError:函数参数类型正确但参数值错误时,会抛出ValueError异常。
* AttributeError:对象没有这个属性时,会抛出AttributeError异常。
* ArithmeticError:所有数值计算错误的基类。
* AssertionError:断言语句失败时抛出AssertionError。
* EnvironmentError:操作系统错误的基类。
* FloatingPointError:浮点计算错误时抛出FloatingPointError。
* ImportError:导入模块/对象失败时抛出ImportError。
* IndentationError:缩进不正常时抛出IndentationError。