错误和异常
作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,
Python 有两种错误很容易辨认:语法错误和异常。
语法错误:Python 的语法错误或者称之为解析错
异常:即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误
语法
try:
正常的操作
......................
except:
发生异常,执行这块代码
else:
不发生异常,执行这块代码
finally:
无论是否发生异常都会执行
章节
try
块让你可以检测代码块中的错误。
except
块让你可以处理错误。
finally
块让你可以执行最终代码,不管try
与except
块的结果如何,finally
块的代码都将执行。
异常处理
当错误(或者异常)发生时,Python通常会停止执行,并报错。
这些异常可以使用try
/except
语句处理:
try 语句按照如下方式工作;
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。
如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 excep 匹配,那么这个异常将会传递给上层的 try 中。
finally块让你可以执行最终代码,不管try与except块的结果如何,finally块的代码都将执行。
示例
下面try
块会产生异常,因为x
没有定义:
try:
print(x)
except:
print("发生异常")
因为try
块引发错误,所以except
块将被执行。
如果没有try
块,程序将崩溃并引发错误:
示例
这个语句会产生一个错误,因为x
没有定义:
print(x)
多个except
可以定义多个except
,例如,可以为一种特殊错误定义一个专门的except代码块:
示例
这个语句会产生一个错误,因为x
没有定义:
try:
print(x)
except NameError:
print("变量x没有定义")
except:
print("其他错误")
else
可以使用else
关键字来定义一个代码块,如果没有错误发生,else
代码块将被执行:
示例
在这个例子中,try块不会产生任何错误:
try:
print("你好")
except:
print("出错了")
else:
print("一切正常")
finally
如果定义了finally
块,则无论try
块是否引发错误,都会执行finally
块。
示例
try:
print(x)
except:
print("出错了")
finally:
print("'try except'处理结束")
这对于关闭对象、清理资源非常有用:
示例
尝试写一个不可写的文件:
try:
f = open("test.txt")
f.write("奇客谷教程")
except:
print("写文件出错了")
finally:
f.close() # 关闭文件
文件被关闭。
try:
a=int(input("输入被除数:"))
b=int(input("输入除数:"))
c=a/b
print("您输入的两个数相除的结果是:",c)
except(ValueError,ArithmeticError):
print("程序发生了数字格式异常,算术异常") #如果b输入0或其他字符会发生异常
except:
print("未知异常")
finally:
print("程序继续运行")
try:
a=int(input("输入被除数:"))
b=int(input("输入除数:"))
c=a/b
print("您输入的两个数相除的结果是:",c)
except Exception as e:
print(e.args) # args:该属性返回异常的错误编号和描述字符串。
print("程序继续运行")
异常类型总结
BaseException # 所有异常的基类
+-- SystemExit # 解释器请求退出
+-- KeyboardInterrupt # 用户中断执行(通常是输入^C)
+-- GeneratorExit # 生成器(generator)发生异常来通知退出
+-- Exception # 常规异常的基类
+-- StopIteration # 迭代器没有更多的值
+-- StopAsyncIteration # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代
+-- ArithmeticError # 各种算术错误引发的内置异常的基类
| +-- FloatingPointError # 浮点计算错误
| +-- OverflowError # 数值运算结果太大无法表示
| +-- ZeroDivisionError # 除(或取模)零 (所有数据类型)
+-- AssertionError # 当assert语句失败时引发
+-- AttributeError # 属性引用或赋值失败
+-- BufferError # 无法执行与缓冲区相关的操作时引发
+-- EOFError # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发
+-- ImportError # 导入模块/对象失败
| +-- ModuleNotFoundError # 无法找到模块或在在sys.modules中找到None
+-- LookupError # 映射或序列上使用的键或索引无效时引发的异常的基类
| +-- IndexError # 序列中没有此索引(index)
| +-- KeyError # 映射中没有这个键
+-- MemoryError # 内存溢出错误(对于Python 解释器不是致命的)
+-- NameError # 未声明/初始化对象 (没有属性)
| +-- UnboundLocalError # 访问未初始化的本地变量
+-- OSError # 操作系统错误,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类
| +-- BlockingIOError # 操作将阻塞对象(e.g. socket)设置为非阻塞操作
| +-- ChildProcessError # 在子进程上的操作失败
| +-- ConnectionError # 与连接相关的异常的基类
| | +-- BrokenPipeError # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入
| | +-- ConnectionAbortedError # 连接尝试被对等方中止
| | +-- ConnectionRefusedError # 连接尝试被对等方拒绝
| | +-- ConnectionResetError # 连接由对等方重置
| +-- FileExistsError # 创建已存在的文件或目录
| +-- FileNotFoundError # 请求不存在的文件或目录
| +-- InterruptedError # 系统调用被输入信号中断
| +-- IsADirectoryError # 在目录上请求文件操作(例如 os.remove())
| +-- NotADirectoryError # 在不是目录的事物上请求目录操作(例如 os.listdir())
| +-- PermissionError # 尝试在没有足够访问权限的情况下运行操作
| +-- ProcessLookupError # 给定进程不存在
| +-- TimeoutError # 系统函数在系统级别超时
+-- ReferenceError # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象
+-- RuntimeError # 在检测到不属于任何其他类别的错误时触发
| +-- NotImplementedError # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现
| +-- RecursionError # 解释器检测到超出最大递归深度
+-- SyntaxError # Python 语法错误
| +-- IndentationError # 缩进错误
| +-- TabError # Tab和空格混用
+-- SystemError # 解释器发现内部错误
+-- TypeError # 操作或函数应用于不适当类型的对象
+-- ValueError # 操作或函数接收到具有正确类型但值不合适的参数
| +-- UnicodeError # 发生与Unicode相关的编码或解码错误
| +-- UnicodeDecodeError # Unicode解码错误
| +-- UnicodeEncodeError # Unicode编码错误
| +-- UnicodeTranslateError # Unicode转码错误
+-- Warning # 警告的基类
+-- DeprecationWarning # 有关已弃用功能的警告的基类
+-- PendingDeprecationWarning # 有关不推荐使用功能的警告的基类
+-- RuntimeWarning # 有关可疑的运行时行为的警告的基类
+-- SyntaxWarning # 关于可疑语法警告的基类
+-- UserWarning # 用户代码生成警告的基类
+-- FutureWarning # 有关已弃用功能的警告的基类
+-- ImportWarning # 关于模块导入时可能出错的警告的基类
+-- UnicodeWarning # 与Unicode相关的警告的基类
+-- BytesWarning # 与bytes和bytearray相关的警告的基类
+-- ResourceWarning # 与资源使用相关的警告的基类。被默认警告过滤器忽略