Python常见异常类型有哪些?

在Python中,所有的异常类都是Exception的子类。Exception类定义在exceptions模块中,该模块在Python的内建命名空间中,我们不必导入就可以直接使用。

每次执行程序遇到错误的时候,程序就会引发异常。如果这个异常对象没有进行处理和捕捉,程序就会用所谓的回溯(traceback,-种错误信息)终止执行,这些信息包括错误的名称(如NameError)、原因和错误发生的行号。

下面来列举几个比较常见的异常。

1. NameError

尝试访问一个未声明的变量,会引发NameErroro例如:

print(test)

错误信息如下:

Traceback (most recent call last):
  File "C:\Users\itcast\PycharmProjects\异常.py", line 8, in <module>
    print(test)
NameError: name 'test' is not defined

上述信息表明,解释器在任何命名空间里面都没有找到test。

2. ZeroDivisionError

当除数为零的时候,会引发ZeoDioenorr异常。例如:

1/0

错误信息如下:

Traceback (most recent call last):
   File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py", line 8, in <module>
     print(1/0)
 ZeroDivisionError: division by zero

事实上,任何数值被零除都会导致上述异常。

3. SyntaxError

当解释器发现语法错误时,会引发SyntaxError异常。例如:

demo_list = ["a","b","c"]
     for i in demo_list
         print(i)

在上述示例中,由于for循环的后面缺少冒号,所以导致程序出现如下错误信息:

File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py ", line 9
     for i in demo_list
           ^
SyntaxError: invalid syntax

SyntaxError异常是唯一不在运行时发生的异常, 它代表着Python代码中有一个不正确的结构,使得程序无法执行。这些错误一般是在编译时发生 ,解释器无法把脚本转换为字节代码。

4. IndexError

当使用序列中不存在的索引时,会引发IndexErr异常。例如:

demo_list = []
 demo_list[0]

上述示例中,demo_list列表中没有没有任何元素,使用索引0访问列表首位元素时,出现如下错误信息:

Traceback (most recent call last):
   File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py ", line 9, in <module>
     demo_list[0]
 IndexError: list index out of range

上述信息表面,列表的索引值超出了列表的范围。

5. KeyError

当使用字典中不存在的键访问值时,会引发KeyError 异常。例如:

dictionary = {'host':'earth', 'port':80}
dictionary['server']

上述示例中,dictionary字典中只有host和port两个键,获取server键对应的值时,出现如下错误信息:

Traceback (most recent call last):
  File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py ", line 9, in <module>
    dictionary['server']
KeyError: 'server'

上述信息表明,出现了字典中没有的键server。

6. FileNotFoundError

试图打开不存在的文件时,会引发FileNotFoundError(Python 3.2以前是IOError)异常。

例如:

file = open("test")

上述示例中,使用open方法打开名为test的文件或目录,出现如下错误信息:

Traceback (most recent call last):
  File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py ", line 8, in <module>
    file = open("test")
FileNotFoundError: [Errno 2] No such file or directory: 'test'

上述信息表明,没有找到名称为test的文件或者目录。

7. AttributeError

当尝试访问未知的对象属性时,会引发AttributeError异常。例如:

class Car(object):
    pass
    
car = Car()
 car.color = '黑色'
 print(car.color)
 print(car.name)

上述示例中,Car 类没有定义任何属性和方法,在创建Car类的实例以后,动态地给car引用的实例添加了color属性,然后访问它的color和name属性时,出现如下错误信息:

Traceback (most recent call last):
  File "C:\Users\itcast\PycharmProjects\Chapter09\异常.py ", line 15, in <module>
    print(car.name)
AttributeError: 'Car' object has no attribute 'name'

上述信息表明,在Car的实例中定义了color属性,所以可以使用car.color的方式访问;但是没有定义name属性,所以访问name属性时就会出错。

### 解决Python中编码异常问题 #### 处理字符串编码错误 当遇到字符串编码错误时,通常是因为尝试将不同编码格式的数据混合在一起。为了防止此类错误,在处理字符串时应始终确保使用统一的编码标准。对于 Python 3.x 版本,默认情况下所有的字符串都是 Unicode 类型,这大大减少了编码冲突的可能性[^1]。 然而,在某些场景下仍然可能碰到编码问题,比如读取外部资源(如文件或网络请求返回的内容)。此时可以显式地指明期望使用的编码: ```python with open('example.txt', 'r', encoding='utf-8') as f: content = f.read() ``` 如果不确定源文件的具体编码,则可以通过 `chardet` 库来检测其编码并据此调整打开方式: ```python import chardet raw_data = open('unknown_encoding_file').read()[:4096] result = chardet.detect(raw_data) encoding = result['encoding'] with open('unknown_encoding_file', 'r', encoding=encoding) as f: content = f.read() ``` #### 文件操作中的编码设置 在进行文件读写操作时,如果不小心忽略了编码参数,就容易引发乱码现象。为了避免这种情况发生,在调用内置函数 `open()` 或者其他涉及 I/O 的库方法时应当明确指出所采用的字符集。例如: ```python # 正确的做法是指定编码为 utf-8 with open('output.log', mode='w', encoding='utf-8') as log_file: log_file.write("这是一个测试。\n") ``` 此外,还可以利用上下文管理器自动关闭已打开的文件流,从而减少潜在的风险点[^2]。 #### 终端输出中文字符 针对特定环境下(如 Linux 系统下的终端)可能出现的 `print` 函数无法正确显示中文的情况,建议先确认当前环境支持哪种类型的字体渲染,并相应配置好系统的区域设定和地区偏好项。之后再考虑修改脚本内部逻辑以适应目标平台特性。具体措施如下所示: - 设置正确的 locale 变量; - 使用 `-u` 参数启动解释器以便启用未缓冲的标准输入/输出模式; - 将所有待打印的信息转换成 UTF-8 编码后再传递给 `sys.stdout.buffer.write()` 方法执行实际输出动作; ```python #!/usr/bin/env python3 -u import sys text = "你好世界".encode('utf-8') sys.stdout.buffer.write(text + b'\n') ``` 以上就是几种常见的解决 Python 中编码异常问题的方式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值