Try/Exception 异常
2025-02-17
- 在发生异常时,如果不采取任何措施,程序通常会立即停止运行,并显示栈跟踪---异常发生前调用的函数清单。对确定导致错误的代码有帮助
引发异常
如除以0抛出异常:ZeroDivisionError
语法错误异常:SyntaxError
代码任何地方都可
注意 大量内置的异常,被组织成层次结构,可参阅:http://dosc.python.org/3/library/exceptions.heml#bltin-exceptions
捕获异常
异常发生,有两种选择;
- 1.忽略异常,让程序崩溃并显示栈跟踪。程序开发期间,这样做,对栈跟踪提供的调试信息很有帮
- 2.捕获异常,并打印友好的错误信息乃至试图修复问题。对于供非程序员使用的程序,几乎都这样做
使用语法:
try: ...... except Errorname(异常名): ......
# 捕获异常案例
def get_age():
while True:
try:
n = int(input("how old are you?"))
return n
except ValueError:
print('Please enter an intefer value.')
# while循环中的try/except快,可将可能引发异常的代码放在try快中
# 当try快中的代码发生异常,就会跳过其他没有执行的语句,立即跳转到except快中。
# 如果try快没有引发异常,将跳过 except ValueError快try/except 块
工作原理有点类似if语句
if语句是根据布尔表达式的结果决定下面执行的内容
try/except根据是否出现了异常决定下面执行的内容
同一函数可能引发多种异常,所以就需要进行多种异常的捕获
捕获多种异常
## 处理多种异常的try/except快
def convert_init(s,base):
try:
return int(s,base)
except (ValueError,TypeError):
return 'error'
# 分别处理不同的异常
def convert_ini2(s,base):
try:
return int(s.base)
except ValueError:
return "value error"
except TypeError:
return "type error"捕获所有异常
# 在except中没有指定异常,将捕获所有异常
def convert_to_init(s,base):
try:
return int(s,base)
except:
return 'error'清理操作
- 在try/except 块中,可以包含 执行清理操作的finally代码块
# 清理操作案例(或者说语法)
def invert(x):
try:
return 1/x
except ZeroDivisionError:
return 'error'
finally:
print('invert(%s) done' % x)
# finally块肯定会执行,不管是否发生异常都要执行某些代码块时,很有用处
# 如通常将关闭文件的语句放在finally块中,这样文件肯定会被关闭,即使发生了IOError另一种格式设置方法
- 在上述的代码块中,为让文件每行开头的行号右对齐,并在行号的左边填充零。
- print语句都使用了字符串插入
- 当需要使用格式字符串,可将print语句替换成下面的语句
print('{0:04}{1}'.format(num,line),end = '')
with语句
- 为了确保发生异常,也能尽快执行清理操作。可以使用python语句with
# 在屏幕上打印文件内容,并在每一行加上行号
num = 1
f = open(fname)
for line in f:
print('{0:04}{1}'.format(num,line),end = '')
num = num + 1
f.close()
# 由于不知道文件将在何时关闭,f通常在for循环结束后关闭,但不清楚去确切的时间。
# 当不知需要后,f 保持打开状态时不确定的,当其他程序访问这个文件,就会导致出错
# 改进,使用with语句
# 确保不在需要的文件尽早关闭 可使用with语句
num = 1
with open(fname,'r') as f:
for line in f:
print('{0:04}{1}'.format(num,line),end = '')
num = num + 1