Python: 异常处理 try-except
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