异常处理
异常是指python在运行过程中出现错误从而产生一个traceback(关于错误的一个具体描述)。
异常处理是指不增加额外的代码和逻辑来避免问题的产生,而通过在发现异常后执行回复代码,从而继续执行程序。
try/except 机制
try/except提供了一个异常处理机制,从而保护可能导致运行错误的某些代码行。
try:
#在这里输入正常情况下执行的代码
except:
#在try发生错误的时候执行的恢复代码
pass
#pass 是 python 的空语句,表示什么也不做
特定指定异常
当异常处理代码设计为处理一种特定类型的错误 ,例如格式错误,输出输入错误等,并输出相应的错误警告时,一定要在except上指定错误类型。
try:
#代码
#指定异常可以产生多个异常处理代码except
except IOError as e:
print(e)
except ValueError as e:
print(e)
# 将错误情况赋值给e并输出。
except Exception as e:
print(e)
# 所有异常处理情况
常见异常:
- IOError:文件打开错误,例如文件不存在 或 权限问题。
- ValueError: 值错误,例如int(‘hello’),可以接受字符串,但是hello不具备整数含义。
- TypeError:类型错误,例如不支持类型的操作,与ValueError相区别。
- IndexError:索引错误,例如列表地址越界。
- KeyError:键值错误,例如字典中不存在的键。
- NameError:命名错误,例如未定义标识符。
- IndentationError: 缩进错误。
- SyntaxError:语法错误。
习惯使用finally
在一些情况下,例如当尝试对文件进行修改
try:
out1 = open('test1.txt,'w')
out2 = open('test2.txt,'w')
print("test txt",file = out1)
print("test txt",file = out2)
out1.close()
out2.close()
except IOError as e:
print('File error' + str(e))
在上述代码中,如果在上面的第二个print发生错误时,将无法正常执行文件的关闭操作,可能会导致写入的数据被破坏。因此可以使用finally对try进行拓展。
try:
out1 = open('test1.txt,'w')
out2 = open('test2.txt,'w')
print("test txt",file = out1)
print("test txt",file = out2)
except IOError as e:
print('File error' + str(e))
finally:
out1.close()
out2.close()
不管发生什么情况,都会执行finally中的代码,从而减少文件数据被破坏的可能性。
with处理文件
在这种情况下,如果发生文件并未打开,则会在finally中关闭文件的时候产生错误。
可以通过增加判断或另一个异常处理
try:
out1 = open('test1.txt,'w')
finally:
if 'out1' in locals():
out1.close()
try:
out1 = open('test1.txt,'w')
finally:
try:
out1.close()
except:
pass
除此之外,python提供了with语句来减少代码量,with是哦那个了上下文管理协议,不再需要操心关闭打开的文件。
try:
with open('test1.txt,'w') as out1:
print("test txt",file = out1)
except IOError as e:
print('File error' + str(e))
异常处理与逻辑上的避免
逻辑避免是指利用类似于if等额外语句从而避免发生错误的情况,但是会增加代码的复杂性,而且需要不停的调试代码,规避各种可能出现的错误。
异常处理也可以增加代码的健壮性,而且避免了大量的判断语句,增加了可读性。