一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
Python 有两种错误很容易辨认:语法错误和异常,Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。
1、语法错误
一般初学者容易遇到的问题,Python 的语法错误或者称之为解析错。
eg:
if True
print("循环打印正确的")
运行时,会抛出语法错误的提示,如下图,函数 print() 被检查到有错误,是它前面缺少了一个冒号 : 。语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个小小的箭头。
2、逻辑错误
python中的逻辑错误,属于编写业务逻辑是出的错误,需要结合业务逻辑来说,就不多介绍了
3、异常
即使Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。大多数的异常都不会被程序处理,都以错误信息的形式展现在这里,异常以不同的类型出现,这些类型都作为信息的一部分打印出来
0不能做除数的异常:
a = 3
b = 0
print(a/b)
此时运行结果会报异常,是因为0不能做除数,本身语法是没有问题的。见图
没有定义的异常:
a = 3
print(b)
此时运行会抛出异常,是因为b没有定义,见图
int 不能与 str 相加的异常:
a = 3
b= "2"
print(a+b)
此时运行会抛出异常,数字和字符串没有办法相加,见图
4、try/except:异常的处理
异常处理用try/except语句来捕获异常。首先执行try子句,在关键字try和关键字except之间的语句,如果没有发生异常,忽略except子句,try子句执行后结束,如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。如果一个异常没有与任何的exceot匹配,那么这个异常将会传递给上一层的try中。一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只能有一个分支会被执行。最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。
eg:
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
此时运行结果为OS error: [Errno 2] No such file or directory: 'myfile.txt',抛出了OSError的错误,如果此时我在第一个except中打印“OSError的错误”,运行打印的结果就是“OSError的错误”。
5、try/except...else
try/except 语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的 except 子句之后。else 子句将在 try 子句没有发生任何异常的时候执行。
eg:
a=78
b=3
try:
a<b
except:
print("a>b")
else:
print("try子句没有发生任何异常")
此时执行结果为“try子句没有发生任何异常”,try的子句没有发生任何异常,执行else后的子句。
6、try/finally
try/finally 语句无论是否发生异常都将执行最后的代码。
eg:
a=78
try:
a<b
except:
print("有异常")
else:
print("try子句没有发生任何异常")
finally:
print("最后执行的子句")
此时运行结果为“有异常”,“最后执行的子句”,因为b没有定义,会抛出b没有定义的异常,所以走except后的子句,打印“有异常”,finally子句不管有没有发生异常都执行,所以都会打印“最后执行的子句”。