目录
1.语法错误:代码不符合编程语言的语法规则,导致代码无法正确解析和执行的错误【能在编辑器中被指出】
2.运行时错误:也被称为异常(Exception),是指在程序运行过程中发生的错误或异常情况,导致程序无法正常执行或产生意外的行为。【运行程序被中断】
3.逻辑错误:也被称为程序逻辑错误,是指程序中存在的与预期逻辑不一致或错误的情况。【程序不会报错,但与预期结果不符合】
错误
1.语法错误:代码不符合编程语言的语法规则,导致代码无法正确解析和执行的错误【能在编辑器中被指出】
常见的语法错误包括:
-
拼写错误:如拼写错误的关键字、函数名或变量名。
-
缺少或多余的符号:如缺少括号、引号或分号,或者使用了多余的符号。
-
整体结构错误:如缩进不正确、语句顺序错误等。
-
数据类型错误:如将一个字符串传递给需要数字的函数,或者进行不兼容的数据类型转换。
-
语法规则冲突:如条件语句中缺少必要的冒号、循环语句中缺少循环体等。
2.运行时错误:也被称为异常(Exception),是指在程序运行过程中发生的错误或异常情况,导致程序无法正常执行或产生意外的行为。【运行程序被中断】
常见的运行时错误有:
-
除0错误(ZeroDivisionError):当程序试图对一个数进行除法操作时,除数为0导致的错误。
-
索引错误(IndexError):当程序尝试访问列表或数组时超出其有效范围的索引编号。
-
类型错误(TypeError):当程序使用不匹配或不支持的数据类型进行操作时的错误。
-
文件操作错误(IOError):例如尝试打开或读取不存在的文件。
-
内存错误(MemoryError):当程序试图申请过大的内存空间,超出可用的系统内存。
3.逻辑错误:也被称为程序逻辑错误,是指程序中存在的与预期逻辑不一致或错误的情况。【程序不会报错,但与预期结果不符合】
常见的逻辑错误:
-
错误的条件判断:程序使用了错误的条件或错误的逻辑关系来进行判断,导致程序不按预期的方式进行分支、循环或判断。
-
错误的变量赋值:错误地对变量赋值,导致程序在后续的计算或决策中产生错误结果。
-
错误的循环控制:循环的起始、结束条件或循环中的计算错误,导致循环无法正确执行或产生错误的迭代次数。
-
错误的算法设计:算法本身存在错误或不完整,导致计算的结果与预期不符。
异常
1. 捕获异常
try:
觉得会出错的语句
except:
捕获异常后执行的操作
else:
没有错误时执行的操作
finally:
无论是否捕获异常均会执行
1. try...except... 【分母为0,打印错误】
这条只能看到try-except中间出错,并不能看出是什么错误
try:
a=9/0
except:
print('错误')
print('结束')
当给except搭配Exception【Exception
是所有内置异常类的基类】时,可以打印出报错信息
try:
a=9/0
except Exception as e:
'''
使用了异常类作为异常处理器,并将捕获的异常实例赋值给变量 e。
Exception 是Python中的基本异常类,它可以捕获几乎所有常见的异常。
当你希望捕获所有类型的异常时,可以使用 Exception。
然而,在实际应用中,最好根据具体情况选择更具体的异常类进行捕获,以便更精确地处理特定类型的异常。
'''
print(e)
print('结束')
'''
division by zero
结束
'''
2. 多个except
捕获异常当然捕获的越精细越好,不同的结果执行不同的操作。
l=[1,2,3]
try:
b='l'+9#先捕获此条异常
print(l[2]/0)#不会执行
print(l[7])
except ZeroDivisionError:#内置异常类,捕获除0错误
print('分母不能为0')
except IndexError:#内置异常类,捕获索引错误
print('索引错误')
except Exception as e:#设置该条语句是为了捕获在预期之外的异常
print(e)
print('结束')
'''
can only concatenate str (not "int") to str
结束
'''
try下面一共有三条语句,从打印的结果可以看到是类似if...elif的形式,只要符合条件后续均不在执行,跳出try...except语句【try逐行检测,先检测的先报错】
异常可以拆开写,当然也能合起来写,只需将多个内置异常类放入元组中即可
except (ZeroDivisionError,IndexError):
print('分母不能为0 或 索引错误')
2. 抛出异常【使用 raise 语句抛出一个指定的异常】
每次执行raise语句,都只能引发一次执行的异常,一般都在if语句后,if为真则执行raise
raise [exceptionName[(reason)]]
其中[]括起来的为可选参数,其作用是指定抛出的异常,以及异常信息的相关描述。
如果可选参数全部省略,则rasie会把当前错误原样抛出
如果省略(reason),则在抛出异常时,将不附带任何异常描述信息
抛出异常不会处理异常【会中断程序】
搭配if,如果字符不是数字则抛出异常
a='7436a63'
if not a.isdigit():
raise Exception('这串字符不是数字')
print('这是数字')
3. 自定义异常【继承基类Exception】
python中异常库中的异常有限,这时就需要自定义异常
检测字符中是否有大写字母存在,若存在则抛出异常
class UP(Exception):
pass
words = ['en', 'mee', 'min', 'MO']
for word in words:
if word.isupper(): # 检测字符是否都为大写
raise UP(word)
上面仅仅只是抛出异常,使用的是if来判断是否不符合预期,不符合预期值则抛出异常
捕获自定义异常
class UP(Exception):
def __init__(self,word):
self.word=word
def __str__(self):
return self.word+'全是大写'
words = ['en', 'Ayu', 'min', 'MO']
try:
for word in words:
if word.isupper(): # 检测字符是否都为大写
raise UP(word)
except UP as e:
print(e)
print('结束')
在raise抛出异常后,被try-except捕获异常并交给UP类,__init__【构造方法,创建类的实例】获取异常数据,__str__【方法用于返回对象的描述信息,如果不使用__str__方法,直接print,或者return,返回的是对象的内存地址】,UP类传递出错误信息给e,打印e
断言
是一种在程序中用于检查和验证特定条件是否成立的机制。它用于确保程序在运行时满足预期的条件,如果条件不成立,断言会触发异常或错误消息来指示问题。【判定为假中断程序】
断言通常具有以下特点:
-
条件检查:断言会对一个布尔表达式进行评估,并检查是否为真。如果条件为假,断言将被认为是失败的。
-
触发异常:当断言失败时,通常会抛出一个特定的异常,例如AssertionError。这会导致程序停止执行,并在控制台或日志中显示错误消息。
-
调试信息:断言通常允许程序员提供与断言相关的调试信息,以便更好地理解断言的目的和失败的原因。
assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常【AssertionError】
assert expression
a=9
b=-9
assert a+b,'该数相加为0'#若断言为真则继续执行,否则结束程序并打印逗号后面的话
c=a+b
print(c)
一般用于判断申请内存是否足够
一些常见的python内置异常类
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
SystemExit | Python 解释器请求退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |