百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-10-08 00:46 9 浏览

Hello,小伙伴们,一切又回归紧张的上学或工作中,别忘了学习哦!

一不小心,python的基础课迎来了它的尾声,本章是最后一课啦!

从头学到到现在,真不容易,奖励一下我们自己吧!任何形式的奖励都行!

在运行python时,经常会遇到各种各样的错误,大的来说,基本上可以把错误分为两类,语法错误(syntax errors)和异常(exceptions)。

语法错误(syntax errors)是初学者最容易犯的错误,简单来说就是代码不符合Python的基本语法规范而导致程序出了问题。

当你的代码完全符合Python的语法规范后,就该尝试运行程序了。但在程序运行过程中,还是有可能会发生问题,我们把这类问题称为异常(exceptions)

1、语法错误

语法错误(syntax errors)是初学者最容易犯的错误,如果代码不符合Python的语法规范,比如漏了冒号,混用中英文符号等,就会出现这种错误。

1.1:SyntaxError: invalid syntax(无效语法)

这是语法错误中最常见的一种了,通常是由下面几种情况引起的。

1.1.1 遗漏了标点符号

需要检查标点符号是否有遗漏,像是在函数定义的时候,括号后面是否有冒号;if条件判断和while循环中的条件后面是否有冒号;for循环的可迭代对象后是否有冒号;还有就是字典中每一个键值对之间是否有逗号等等。

还有就是你可能将==写成了=,没有将等于和赋值区分开。

1.1.2 关键字拼写错误或遗漏。

很有可能是因为你手抖或者粗心,将while写成了whlie,将def写成了dfe之类的错误,或者可能是你将for…in…中的关键字in忘写了。

1.1.3变量名或函数名使用了关键字。

这种情况即使是Python中级玩家也有概率会犯错,python3中的内置关键字:and,as,assert,break,class,continue,def,del,elif,else,except,False,finally,for,from,global,if,import,in,is,lambda,None,not,nonlocal,or,pass,raise,return,True,try,while,with,yield大部分的开发环境都会用不同颜色来显示关键字。

1.2、SyntaxError: invalid character in identifier(标识符中有无效字符)

有时候运行代码,会出现SyntaxError: invalid character in identifier这个错误。这有可能是你在写代码时频繁地切换中英文输入法所造成的。知道了问题出现的原因,解决办法也就呼之欲出了,将我图片中标记出来的中文标点修改为对应的英文符号即可。

1.3、NameError: name 'xxx' is not defined - 这通常表示代码中引用了一个未定义的变量或函数。

1.4、ValueError: invalid literal for int() with base xxx - 这通常表示代码中尝试将无效的字符串转换为整数。

1.5、KeyError: 'xxx' - 这通常表示代码中尝试使用不存在的键访问字典。

1.6、AttributeError: 'xxx' object has no attribute 'xxx' - 这通常表示代码中尝试访问不存在的属性。

1.7、SyntaxError: EOL while scanning string literal(检查到不完整的字符串)

这种情况通常是因为遗漏了字符串两边的引号,或者混用了引号(即字符串两边的引号不统一)。

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 = 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 = arg

try:
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=atleast

def 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,并能用于日常工作中。

后续还会推出高级课程,请大家关注我oceansl,或私信我,让我们一起成长吧。

相关推荐

pyproject.toml到底是什么东西?(py trim)

最近,在Twitter上有一个Python项目的维护者,他的项目因为构建失败而出现了一些bug(这个特别的项目不提供wheel,只提供sdist)。最终,发现这个bug是由于这个项目使用了一个pypr...

BDP服务平台SDK for Python3发布(bdp数据平台)

下载地址https://github.com/imysm/opends-sdk-python3.git说明最近在开发和bdp平台有关的项目,用到了bdp的python的sdk,但是官方是基于p...

Python-for-Android (p4a):(python-for-android p4a windows)

一、Python-for-Android(p4a)简介Python-for-Android(p4a),一个强大的开发工具,能够将你的Python应用程序打包成可在Android设备上运行...

Qt for Python—Qt Designer 概览

前言本系列第三篇文章(QtforPython学习笔记—应用程序初探)、第四篇文章(QtforPython学习笔记—应用程序再探)中均是使用纯代码方式来开发PySide6GUI应用程序...

Python:判断质数(jmu-python-判断质数)

#Python:判断质数defisPrime(n):foriinrange(2,n):ifn%i==0:return0re...

为什么那么多人讨厌Python(为什么python这么难)

Python那么棒,为什么那么多人讨厌它呢?我整理了一下,主要有这些原因:用缩进替代大括号许多人抱怨Python完全依赖于缩进来创建代码块,代码多一点就很难看到函数在哪里结束,那么你就需要把一个函数拆...

一文了解 Python 中带有 else 的循环语句 for-else/while-else

在本文中,我们将向您介绍如何在python中使用带有else的for/while循环语句。可能许多人对循环和else一起使用感到困惑,因为在if-else选择结构中else正常...

python的numpy向量化语句为什么会比for快?

我们先来看看,python之类语言的for循环,和其它语言相比,额外付出了什么。我们知道,python是解释执行的。举例来说,执行x=1234+5678,对编译型语言,是从内存读入两个shor...

开眼界!Python遍历文件可以这样做

来源:【公众号】Python技术Python对于文件夹或者文件的遍历一般有两种操作方法,一种是至二级利用其封装好的walk方法操作:import osfor root,d...

告别简单format()!Python Formatter类让你的代码更专业

Python中Formatter类是string模块中的一个重要类,它实现了Python字符串格式化的底层机制,允许开发者创建自定义的格式化行为。通过深入理解Formatter类的工作原理和使用方法,...

python学习——038如何将for循环改写成列表推导式

在Python里,列表推导式是一种能够简洁生成列表的表达式,可用于替换普通的for循环。下面是列表推导式的基本语法和常见应用场景。基本语法result=[]foriteminite...

详谈for循环和while循环的区别(for循环语句与while循环语句有什么区别)

初九,潜龙勿用在刚开始使用python循环语句时,经常会遇到for循环和while循环的混用,不清楚该如何选择;今天就对这2个循环语句做深入的分析,让大家更好地了解这2个循环语句以方便后续学习的加深。...

Python编程基础:循环结构for和while

Python中的循环结构包括两个,一是遍历循环(for循环),一是条件循环(while循环)。遍历循环遍历循环(for循环)会挨个访问序列或可迭代对象的元素,并执行里面的代码块。foriinra...

学习编程第154天 python编程 for循环输出菱形图

今天学习的是刘金玉老师零基础Python教程第38期,主要内容是python编程for循环输出菱形※。(一)利用for循环输出菱形形状的*号图形1.思路:将菱形分解为上下两个部分三角形图案,分别利用...

python 10个堪称完美的for循环实践

在Python中,for循环的高效使用能显著提升代码性能和可读性。以下是10个堪称完美的for循环实践,涵盖数据处理、算法优化和Pythonic编程风格:1.遍历列表同时获取索引(enumerate...