异常
程序遇到严重错误时, 会终止程序的运行并抛出异常
def my_sub(a, b):
return a / b
my_sub(1, 0)
捕获异常
try:
表达式
except [Exception] as e:
表达式
finnaly:
表达式
def my_sub(a, b):
try:
return a / b
except ZeroDivisionError:
# print(e)
print("分母不可为0")
return None
finally:
print("function my_sub end")
my_sub(1, 0)
Exception
所有异常的基类, 所有的异常都是Exception的子类
处理异常颗粒度要细一点, 尽量不要捕获基类Exception, 尤其是数据处理的时候.
常见的异常
- IndexError 索引值超过了列表长度
>>> l = [1]
>>> l[2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
- KeyError 找不到Key
>>> d = {"a": 1}
>>> d["b"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'b'
- ValueError 传入的参数错误
>>> int('a1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'a1'
- TypeError 类型错误, 常见于运算
>>> 1 + '2'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
-
SyntaxError 语法报错, 检查自己的语法有没有写错
-
IndentationError
缩进错误
-
混用tab和space(空格)
-
缩进长度不对
-
如何处理异常
-
抛出新异常
def my_sub(a, b):
try:
return a / b
except ZeroDivisionError:
print("分母不可为0")
raise Exception("params error")
finally:
print("function my_sub end")
-
重新抛出
def my_sub(a, b):
try:
return a / b
except ZeroDivisionError:
print("分母不可为0")
raise ZeroDivisionError
finally:
print("function my_sub end")
-
忽略(不推荐)
pass
用来指示当前处理语句没有正式写完, 尽量不要忽略异常, 否则代码的健壮度会很差, 造成不可预知的bug.
自定义异常
class ParamsError(Exception):
pass
def my_sub(a, b):
try:
return a / b
except ZeroDivisionError:
raise ParamsError("分母不可以为0")
finally:
print("function my_sub end")