python教程从基础到精通,第15课—错误和异常

Hello,小伙伴们 , 一切又回归紧张的上学或工作中 , 别忘了学习哦!
一不小心,python的基础课迎来了它的尾声 , 本章是最后一课啦!
从头学到到现在,真不容易 , 奖励一下我们自己吧!任何形式的奖励都行!
在运行python时,经常会遇到各种各样的错误,大的来说,基本上可以把错误分为两类,语法错误(syntax errors)和异常(exceptions) 。
语法错误(syntax errors)是初学者最容易犯的错误,简单来说就是代码不符合Python的基本语法规范而导致程序出了问题 。
当你的代码完全符合Python的语法规范后,就该尝试运行程序了 。但在程序运行过程中,还是有可能会发生问题 , 我们把这类问题称为异常(exceptions) 。
1、语法错误
语法错误(syntax errors)是初学者最容易犯的错误,如果代码不符合Python的语法规范,比如漏了冒号 , 混用中英文符号等,就会出现这种错误 。
1.1:SyntaxError: invalid syntax
这种情况通常是因为遗漏了字符串两边的引号,或者混用了引号(即字符串两边的引号不统一) 。
1.8、IndentationError 缩进错误
在Python中,冒号下面的缩进会帮助程序区分代码之间的层次,这些不同的层次代表了代码运行的逻辑及先后顺序 。但如果在需要缩进的语句下面没有使用正确的缩进层级 , 甚至没有使用缩进,程序就会报错 。
1.9.1 IndentationError: expected an indented block(需要缩进的代码块)
myname='张三'
if myname=='张三':
print('就是你')
当没有缩进时,if条件判断和需要运行的print()语句会成为两个独立的语句,可以理解为“平行关系” 。
这样,第二行的if条件判断下面就缺少了可以运行的语句 。那么无论条件是否成立,都不会有任何对应的操作,所以这个条件判断就失去了存在的意义 。
1.9.2 IndentationError: unindent does not match any outer indentation level(缩进内容不匹配任何一个层级)
a = 0
while a < 5:
if a == 3:
break
a += 1
print(a)
代码中的最后一行,print(a)无法找到属于它的代码块 。即print(a)要么和if条件判断平级 , 要么直接与while循环平级 。它现在的缩进层级使Python无法识别出它到底属于哪一部分,要让上面的代码顺利运行 , 需要将print(a)调整到和if条件判断平级,这样程序就会打印每次循环后a的值 。或者,将print(a)调整到和while循环平级,这样程序就会打印最后一次循环后a的值 。
1.10、TypeError: xxx() takes xxx positional arguments but xxx were given – 这通常表示代码中函数调用时传入了错误的参数数量或类型 。
2、异常处理
2.1、异常的定义与产生
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行 。
一般情况下 , 在Python无法正常处理程序时就会发生一个异常 。
异常是Python对象 , 表示一个错误 。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行 。
2.2、异常处理
捕捉异常可以使用try/except语句,try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理 。如果你不想在异常发生时结束你的程序,只需在try里捕获它 。
语法:
以下为简单的try…except…else的语法:
try:<语句> #运行别的代码except <名字>:<语句> #如果在try部份引发了'name'异常except <名字>,<数据>:<语句> #如果引发了'name'异常 , 获得附加的数据else:<语句> #如果没有异常发生
try的工作原理是 , 当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常 。
· 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常) 。
· 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息) 。
· 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句 。
下面是简单的例子,它打开一个文件,在该文件中的内容写入内容,且并未发生异常:
以只读方式打开文件 , 由于原本没有该文件,读取发生了异常,实例
try: open("qwe.txt","r") print("123")except FileNotFoundError: #错误的标题 print("异常处理") #错误的内容else: print("没有异常")
下面是以读取的方式打开一个文件,在该文件中的内容写入内容,但文件没有写入权限,发生了异常:
try: f=open("test01.txt",encoding='utf-8') print(f.read())except (NameError,FileNotFoundError,TypeError) as rese:#捕获多种异常 print("出现异常:",rese)else: print("没有异常")#出现异常: [Errno 2] No such file or directory: 'test01.txt'
2.3、try-finally 语句
try-finally 语句无论是否发生异常都将执行最后的代码 。
finally块中的所有语句执行后,异常被再次触发,并执行except块代码 。
try:<语句>finally:<语句> #退出try时总会执行raise
示例代码:
try: open("test0001.txt")except: print("出现异常")else: print("没有异常")finally: print("有没有异常都会执行")
来人上复杂点的:
try: runoob()except AssertionError as error: print(error)else: try: with open('file.log') as file: read_data = https://www.30zx.com/file.read() except FileNotFoundError as fnf_error: print(fnf_error)finally: print('这句话,无论异常是否发生都会执行 。')
再来看一例:
try: fh = open("testfile", "w") try: fh.write("这是一个测试文件 , 用于测试异常!!") finally: print("关闭文件") fh.close()except IOError: print("Error: 没有找到文件或读取文件失败")#输出:关闭文件
2.4、抛出异常
Python 使用 raise 语句抛出一个指定的异常 。
raise语法格式如下:raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种 , args 是自已提供的异常参数 。
示例代码:
def ss(score): if score<0 or score>100: raise Exception('Invalid score',score) else: print('score:',score)ss(200)
结果:(0-100内正常)
raise 唯一的一个参数指定了要被抛出的异常 。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类) 。如果你只想知道这是否抛出了一个异常,并不想去处理它 , 那么一个简单的 raise 语句就可以再次把它抛出 。
try: raise NameError('HiThere') # 模拟一个异常 。except NameError: print('An exception flew by!') raise
2.5、自定义异常
通过创建一个新的异常类,程序可以命名它们自己的异常 。异常应该是典型的继承自Exception类,通过直接 或间接的方式 。
class Networkerror(RuntimeError): def __init__(self, arg): self.args = argtry: raise Networkerror("Bad hostname")except Networkerror as e: print(e.args)#('B', 'a', 'd', ' ', 'h', 'o', 's', 't', 'n', 'a', 'm', 'e')
再来一个复杂点的:
class Error(Exception): # def __init__(self): #初始化方法(没有参数) # pass def __init__(self,len,atleast): #初始化方法(有参数) self.lenth=len self.minlenth=atleastdef main(): try: word=input('请输入密码:') if len(word)<6: # raise引发自定义的异常 , raise Error()实例化没有参数 raise Error(len(word),6) #实例化方法 except Exception as re: #re是一个对象 # print('Error:输入密码长度过短!!!') #没有参数传递 # print('Error:输入密码长度过短,密码长度至少为%d位' % (Error.minlenth), re) # #类不能调用实例属性 AttributeError: type object 'Error' has no attribute 'minlenth' print('Error:输入密码长度过短,密码长度至少为%d位\\n' %(re.minlenth),'re:',re) else: print('无异常')main()
输出结果:
3、标准错误与异常
下面列出了系统已定义好的各种错误和异常,可以直接引用 。
愉快学习的时光总是过得很快,一不小心又到结尾啦,并且是本系列课程的结尾 。
先来给自己一个奖励,双手举起,yeah!
【python教程从基础到精通,第15课—错误和异常】希望大家能一如既往地每天学习一点python,并能用于日常工作中 。
后续还会推出高级课程,请大家关注我oceansl,或
以上就是朝夕生活(www.30zx.com)关于“python教程从基础到精通,第15课—错误和异常”的详细内容,希望对大家有所帮助!

猜你喜欢