【Python】一文总结Python中常见错误 异常及异常处理机制
文章目录
- Python中的错误
- 常见语法错误
- Python中的异常
- 常见异常类型
- 异常处理
- Python中异常处理
- try...except...异常处理结构
- try...except...finally...异常处理结构
- 自定义异常raise
Python中的错误
定义:python中的错误通常是指代码运行前的语法和逻辑错误。
语法错误指源代码中的拼写不符合解释器所要求的语法规则,一般运行的时候提示SyntaxError。语法错误必须在程序运行前改正,否则程序无法运行
逻辑错误指程序代码可执行,但执行结果不符合要求。例如求两个数中的最大值,返回的却是最小数。
常见语法错误
- 需要使用英文符号的地方使用了中文符号,例如逗号,冒号,引号,括号等,如print(“hello world”)其中引号或括号为中文符号。
- 变量、函数等命名不符合标识符规范,如2a=[1,2,3,4,5]中变量命名就不符合规范。
- 条件语句 循环语句 函数定义后面忘记了冒号,如for i in range(3)print(i)
for i in range(3)
print(i)
- 位于同一层级的语句缩进不一致,如for循环头和循环体头并齐for i in range(3):print(i)
for i in range(3):
print(i)
- 判断两个对象相等时,使用"=“而不是”==",如 if(i=4)。
- 语句较为复杂时,括号的嵌套关系错误,少了或者多了左括号或右括号。
- 函数定义时,不同类型参数之间的顺序和数量不符合要求。
Python中的异常
定义:指程序语法正确,但执行中因一些意外而导致的错误,异常并不是一定会发生。例如两个数相除时,除数为0时将会发生异常。默认情况下,程序运行中遇到异常时会终止,并在控制台打印除异常出现的堆栈信息。通过程序可避免因异常导致的程序终止。
例如除数为0时会报如下错误:
ZeroDivisionError: division by zero
其中ZeroDivisionError为异常类型,division by zero为异常解释信息,剩余的为异常调用的堆栈信息。
常见异常类型
- IndexError:下标索引越界,例如列表s中有6个元素,访问s[6]实际上是访问第7个元素,越界了。
- TypeError:执行了类型不支持的操作,如0+a等。
- KeyError:键错误,访问字典中不存在的键,关键字参数匹配不到形参变量。
- ValueError:类型符合要求但值不符合要求,例如将字母字符串转为整型。
- NameError:使用了未定义的变量或者函数。
- ZeroDivisionError:执行除法时,除数为0。
- AttributeError:属性错误,试图访问不存在的属性,例如s为列表,a.length。
- FileNotFoundError:文件找不到错误,指定的路径下不存在指定文件。
异常处理
定义:异常处理是指程序设计时,就考虑到了可能出现的意外情况,为了避免因异常而导致程序终止给用户带来不好的体验而做的一些额外操作。例如,当执行两个数相除时,如果用户输入的除数为 0,则提示用户除数不能为0,让他重新输入,而不是直接终止,给用户提示一大堆异常堆栈信息。异常处理使得异常出现后,程序仍然可以继续执行。
Python中异常处理
定义:Python中通常将可能发生异常的代码放在try语句中,如果发生异常则通过 except 语句来捕获异常并对做一些额外处理,如果没有发生异常则执行后面的 else 语句,最后执行finally 语句做一些收尾操作。
try…except…异常处理结构
try子句后面可以有多个except子句,分别用来处理不同类型的异常,但最多只有一个except子句执行。示例如下:
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except ZeroDivisionError:
print("抛出异常,除数不能为0!")
except ValueError:
print("输入不能为字母字符串!")
print("division函数执行结束!")
print(division(6, "8"))
print("----------------------")
print(division(6, "a"))
一个except子句可以同时处理多个异常,多个异常名称放在一个元组中。示例如下:
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except (ZeroDivisionError,ValueError):
print("抛出异常!")
print("division函数执行结束!")
print(division(6, "a"))
通常会在except子句的最后加上一个不带异常名称的except子句或异常名称为Exception的exception子句,此时可捕获所有的异常,避免程序意外终止。
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except:
print("抛出异常!")
print("division函数执行结束!")
print(division(6, "a"))
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except Exception:
print("抛出异常!")
print("division函数执行结束!")
print(division(6, "a"))
通常会将捕获到的异常赋值给某个变量,然后通过该变量获取异常的信息,例如except 异常名称 as 变量
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except Exception as e:
print(e)
print("division函数执行结束!")
print(division(6, "a"))
try…except…finally…异常处理结构
try…except…finally…异常处理结构中,finally子句主要用来进行收尾工作,即无论是否发生异常都会执行finally子句。若try或except子句中存在break、continue、return语句,finally子句将在这些语句执行前执行。
def addition(a, b):
try:
c = a + b
return c
except Exception as e:
print(e)
c = []
return c
finally:
c.append(5)
print("finally语句中的c=", c)
print("addition函数执行结束!")
print(addition([1, 2], [3, 4]))
print(addition([1, 2], 3))
如果finally中有return语句,则优先执行finally中的return,try或except中返回值将被覆盖;如果finally中没有return则执行try或except中的return。如果返回值为不可变类型(整数、字符串、元组),则不会受finally语句的影响。如下程序可通过注释return -1看到相应的区别:
def division(a, b):
try:
a = float(a)
b = float(b)
print("a=", a, "b=", b)
c = a / b
print("c=", c)
return c
except Exception as e:
print(e)
finally:
print("finally子句")
return -1
print(division(6, 8))
自定义异常raise
除了系统中提供的一些异常之外,我们也可以根据业务需要抛出自定义的异常,例如要求传递过来的字符串长度在6到10 位之间,不满足要求时,抛出异常。有时候,我们捕获到了异常,但暂时不知道如何处理,此时也可以抛出异常,让其他调用者进行处理。Python中提供了raise语句允许用户主动抛出异常,raise关键字后面需要提供一个异常实例或者异常类,如果传递的是异常类,则会调用无参数的构造方法来实例化对象。如果捕获到了异常,但是暂时不处理,可以直接通过raise语句抛出异常,此时raise关键字后面什么都不用写。
def str1(s):
if len(s) < 6 or len(s) > 12:
raise ValueError("长度不在6-12之间")
else:
print("长度符合要求")
user = input("请输入一个长度再6-12之间的字符串:")
# str1(user)
try:
str1(user)
except Exception as e:
print(e)
print("输入不合法!")