在程序运行过程中,总会遇到各种各样的错误。有的错误是编程代码有问题造成的,这种错误称为BUG,BUG是必须要修复。有的错误是用户输入造成的,这种错误可以通过检查用户的输入来做响应处理。还有一种错误是完全无法在程运行过程中检测的。比如写文件的时候,磁盘满了,就写不进去。比如从网络中抓取数据,突然断网了,就获取不到了。通常这种情况称为异常,在程序中必须要处理,否则程序会因为各种问题个结束
遇到错误最原始的解决方案
事先约定一个错误代码,这样就知道是否有错误,在系统提供的调用中非常常用
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">checkUser</span><span class="hljs-params">(account, passwd)</span>:</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> account:
<span class="hljs-keyword">return</span> <span class="hljs-number">-1</span>
<span class="hljs-keyword">elif</span> passwd != <span class="hljs-string">"1"</span>:
<span class="hljs-keyword">return</span> <span class="hljs-number">-2</span>
ret = checkUser(<span class="hljs-string">"sunck"</span>, <span class="hljs-string">"666"</span>)
需求
当程序遇到错误代码时,不让程序结束,而是越过错误继续向下执行
<span class="hljs-comment"># 错误代码</span>
<span class="hljs-comment"># num = 0</span>
<span class="hljs-comment"># print(1 / num)</span>
格式
try:
语句t
except 错误表示码1 as e:
语句1
except 错误表示码2 as e:
语句2
……
except 错误表示码n as e:
语句n
作用
用来检测“语句t”的错误,从而让except语句捕获异常进行处理
逻辑
a、如果“语句t”执行时发送异常,就跳回到执行try并执行一个匹配该异常的except子句,异常处理结束就结束整个try……except语句(除非处理异常时又引发了新的异常)
b、如果“语句t”执行时发送异常,但是却没有匹配的except子句,异常提交到上一级try,或者到程序的最上层
c、如果“语句t”执行时没有异常,就不会匹配except子句。结束整个try……except……语句继续向下执行
说明
e:异常的描述
基本使用
<span class="hljs-keyword">try</span>:
<span class="hljs-number">1</span> / <span class="hljs-number">0</span>
<span class="hljs-keyword">except</span> ZeroDivisionError <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"----------1"</span>)
print(e, type(e))
print(str(e))
<span class="hljs-keyword">except</span> KeyError <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"----------2"</span>)
特殊使用
使用except而不带任何错误表示码,捕获任意的异常
<span class="hljs-keyword">try</span>:
<span class="hljs-number">1</span> / <span class="hljs-number">0</span>
<span class="hljs-keyword">except</span>:
print(<span class="hljs-string">"有错误"</span>)
使用except而带有多种错误表示码,同时匹配多种异常,只要符合其中之一即可捕获
<span class="hljs-keyword">try</span>:
<span class="hljs-number">1</span> / <span class="hljs-number">0</span>
<span class="hljs-keyword">except</span> (ZeroDivisionError, KeyError, AttributeError) <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"------"</span>)
使用注意事项
python中的错误表示码实际上是类,所有的错误类都继承自BaseException,所以在使用时注意父类会将子类错误一网打尽
<span class="hljs-keyword">try</span>:
<span class="hljs-number">1</span> / <span class="hljs-number">0</span>
<span class="hljs-keyword">except</span> BaseException <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"------1"</span>)
<span class="hljs-keyword">except</span> ZeroDivisionError <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"------2"</span>)
跨多层调用,main里调用f2,f2里调用f1,在f1里出错了,只需要再main里捕获就可以处理
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">f1</span><span class="hljs-params">()</span>:</span>
ret = <span class="hljs-number">1</span> / <span class="hljs-number">0</span>
<span class="hljs-keyword">return</span> ret
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">f2</span><span class="hljs-params">()</span>:</span>
f1()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">try</span>:
f2()
<span class="hljs-keyword">except</span> ZeroDivisionError <span class="hljs-keyword">as</span> e:
print(<span class="hljs-string">"----------"</span>)
格式
try:
语句t
except 错误表示码1 as e:
语句1
except 错误表示码2 as e:
语句2
……
except 错误表示码n as e:
语句n
else:
语句e
逻辑
a、如果“语句t”执行时发送异常,就跳回到执行try并执行一个匹配该异常的except子句,异常处理结束就结束整个try……except……else语句(除非处理异常时又引发了新的异常)
b、如果“语句t”执行时发送异常,但是却没有匹配的except子句,异常提交到上一级try,或者到程序的最上层
c、如果“语句t”执行时没有异常,就不会匹配except子句。如果有else语句则执行“语句e”,执行完则结束整个try……except……else语句继续向下执行
代码
try:
1 / 0
except ZeroDivisionError as e:
print("************")
else:
print("---------")
格式
try:
语句t
except 错误表示码1 as e:
语句1
except 错误表示码2 as e:
语句2
……
except 错误表示码n as e:
语句n
finally:
语句f
作用
无论try中的语句是否发生异常,都将执行“语句f”
代码
try:
1 / 1
except ZeroDivisionError as e:
print("************")
finally:
print("---------")