Python中如何处理常见的报错

本文详细介绍了Python编程中常见的语法错误和异常,包括SyntaxError、IndentationError、TypeError、IndexError等,并提供了具体案例和解决方法。

1.首先是常见的语法错误。
2.然后是基础语法中的常见异常。
3.最后是操作文件过程中的常见异常,这部分也是重难点知识。

这是我们在终端比较常见的报错信息:

 按照 Python 官方文档的定义,我们在终端见到的“错误消息”至少可以被分为两类:语法错误(syntax errors)和异常(exceptions) 。

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

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

比如两种常见的语法错误 SyntaxError 和 IndentationError 以及它们产生的原因和相应的解决办法。

首先我们来看看 SyntaxError 。

第一种:SyntaxError: invalid syntax(无效语法),这是语法错误中最常见的一种了,通常是由下面几种情况引起的:

一、遗漏了标点符号。
二、关键字拼写错误或遗漏。
三、变量名或函数名使用了关键字。

第二种:SyntaxError: invalid character in identifier(标识符中有无效字符),这种错误一般是由于代码里使用了大量中文符号,比如中文括号,中文逗号,中文冒号和中文引号。这有可能是你在写代码时频繁地切换中英文输入法所造成的。

第三种:SyntaxError: EOL while scanning string literal(检查到不完整的字符串),这种情况通常是因为遗漏了字符串两边的引号,或者混用了引号(即字符串两边的引号不统一)。解决办法也很简单,仔细检查字符串两头的引号是否有遗漏,而且需要记住,单引号和单引号匹配,双引号和双引号匹配,三引号和三引号匹配。

图片总结一下:

 第二个要介绍的常见语法错误就是 IndentationError,即缩进错误。 在 Python 中,冒号下面的缩进会帮助程序区分代码之间的层次,这些不同的层次代表了代码运行的逻辑及先后顺序。但如果在需要缩进的语句下面没有使用正确的缩进层级,甚至没有使用缩进,程序就会报错。

比如两种常见的缩进错误:

第一种:IndentationError: expected an indented block(需要缩进的代码块),这种多半是由于某些需要缩进的地方没有缩进导致的,修复这种缩进错误的方法也十分简单 —— 对症下药,理清代码的运行顺序与逻辑,在应该缩进的地方(例如:if 条件判断,for 循环,while 循环,def 函数定义,class 类的创建)加入缩进即可。

第二种:IndentationError: unindent does not match any outer indentation level(缩进内容不匹配任何一个层级),这种主要是因为某一行的缩进没有和其他位置对齐使得程序无法找到匹配的代码块导致的,解决办法就需要我们理清代码块的层级并将缩进对齐。

总结如下:

 接着我们来看看基础语法中常见的异常,第一个要介绍的是基础语法中常见的异常 TypeError,即类型错误。 

区分异常和错误的方法就需要我们去观察终端的提示信息,一般情况下,异常的“错误消息”会显示Traceback (most recent call last),而语法错误就不会显示。 

下面列举三种较为常见的类型错误:

第一种:TypeError: unsupported operand type(s) for …(不支持的运算)

第二种:TypeError: can only concatenate str (not "int") to str (只能用字符串拼接字符串)

第三种:TypeError: 'xxx' object is not iterable(对象不可被迭代)

具体的解决方法可以结合下图:

一句话总结:为了避免类型错误,你需要确定自己使用的数据类型是什么(可以借助 type()),需要进行的操作是什么,从而去确认是否需要使用函数来进行类型转换。

第二种异常是IndexError ,这个异常,和列表取值有关。 出现频率较高的索引错误是 IndexError: list index out of range(索引超出了范围),在列表中使用索引取值时,一定要确保索引在正确的范围区间内。

最后,我们讲了几种操作文件过程中的常见异常。第一种是 ModuleNotFoundError 未找到模块错误,是一种有关模块的异常,解决这个异常的方法十分简单,只要你在导入模块时仔细检查模块的拼写是否正确即可。

第二种是 AttributeError 属性错误 ,为了避免这种异常,我们在使用模块中的方法时,需要先检查拼写是否正确,确认拼写无误后,再检查模块或库中是否存在该方法或属性。

第三种是 FileNotFoundError 文件找不到的错误,为了避免这种异常,我们需要按照路径找到对应的文件或文件夹,检查文件或文件夹名是否正确。

最后一种是 UnicodeDecodeError 即编码解码错误,它也是 open() 函数的另一个参数 encoding 会引发的异常,之前课程讲的写法是 encoding = 'utf-8',这是因为,大部分工作场景的文件编码格式都是 'utf-8'。但如果你需要使用别人分享的代码时,很有可能会因为你们之间使用了不同的编码格式而引发异常。

以后遇到这样的异常,有两种解决方法:

第一种,先利用 VSCode 等软件去查看文件的编码格式,然后再将文件的编码格式修改为你在代码中写的编码格式即可。

第二种,还是先在 VSCode 里面查看文件的编码格式,然后将代码中的 encoding 参数改为该文件的编码格式即可。

总结如下:

 而实际上我们在写代码的过程中可能遇到的错误远不止这些,所以大家需要培养的是这种自己发现错误和解决错误的能力,这就需要我们不断的尝试以及学会到百度上搜索查阅资料来积累经验了。

Python 中使用 `*args` 时可能会遇到各种报错,具体错误通常取决于使用场景和参数传递方式。以下是一些常见错误原因及解决方法。 ### 1. **TypeError: 函数参数类型不匹配** 当使用 `*args` 传递的参数类型与函数期望的参数类型不匹配时,会引发此错误。 **示例代码:** ```python def add_numbers(a, b): return a + b args = (2, '3') result = add_numbers(*args) # TypeError: unsupported operand type(s) for +: 'int' and 'str' ``` **解决方法:** 确保传递给函数的参数类型是正确的,或者在函数内部添加类型检查和转换逻辑。 ```python def add_numbers(a, b): try: return int(a) + int(b) except ValueError: return "Invalid input types" args = (2, '3') result = add_numbers(*args) print(result) # 输出: 5 ``` ### 2. **TypeError: 参数数量不匹配** 当使用 `*args` 解包的参数数量少于或超过函数定义的参数数量时,会引发此错误。 **示例代码:** ```python def multiply_numbers(a, b, c): return a * b * c args = (2, 3) result = multiply_numbers(*args) # TypeError: multiply_numbers() missing 1 required positional argument: 'c' ``` **解决方法:** 确保传递的参数数量与函数定义的参数数量一致。 ```python args = (2, 3, 4) result = multiply_numbers(*args) print(result) # 输出: 24 ``` ### 3. **MemoryError: 使用生成器导致内存溢出** 当将一个大型生成器通过 `*args` 传递给函数时,Python 会尝试将其转换为元组,这可能导致内存溢出。 **示例代码:** ```python def process_data(*args): print(len(args)) # 假设生成器产生大量数据 gen = (x for x in range(10000000)) process_data(*gen) # MemoryError: Failed to allocate memory ``` **解决方法:** 避免直接将大型生成器解包为 `*args`,可以改用迭代器或其他方式处理数据。 ```python def process_data(data): for item in data: pass # 处理每个 item gen = (x for x in range(10000000)) process_data(gen) # 正常处理,不会导致内存溢出 ``` ### 4. **SyntaxError: 错误地使用 `*args` 或 `**kwargs`** 在函数定义中,`*args` 必须出现在 `**kwargs` 之前,否则会引发语法错误。 **示例代码:** ```python def example_function(**kwargs, *args): # SyntaxError: invalid syntax pass ``` **解决方法:** 确保在函数定义中,`*args` 出现在 `**kwargs` 之前。 ```python def example_function(*args, **kwargs): pass ``` ### 5. **TypeError: 在不支持的上下文中使用 `*args`** 在某些不支持可变参数的上下文中使用 `*args` 也会导致错误。 **示例代码:** ```python def example_function(a, b, c): pass args = [1, 2, 3, 4] example_function(*args) # TypeError: example_function() takes 3 positional arguments but 4 were given ``` **解决方法:** 确保传递的参数数量不超过函数定义的参数数量。 ```python args = [1, 2, 3] example_function(*args) # 正常调用 ``` ### 总结 在使用 `*args` 时,需要注意参数的类型、数量以及上下文环境。通过确保参数的一致性和正确性,可以有效避免常见错误。此外,对于大型数据集,应谨慎使用 `*args` 以避免内存问题[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值