python异常处理

Python异常处理

try...except...else语法

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字> as <数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么会根据try执行的子句内容和except语句,出现三种不同的流程:

  • try子句执行过程中出现异常,且下面的except中有匹配的异常类型,则会执行匹配到的except字句,然后通过整个try流程(就是else后的内容不会执行)
  • try子句执行过程中出现异常,但是下面的except中吗,没有匹配的异常类型,此时异常会被递交到上层的try流程,或者程序的最上层(此时会结束程序并打印出默认的错误信息)
  • try子句执行过程中没有发生异常,则会执行else语句,然后通过真个try流程

except后面可以接一个或者多个异常名;或者不接任何内容表示捕获所有异常:

except IOError:

except (IOError, ValueError):

except:

except ValueError as Argument:  # Argument用于将异常作为一个变量打印出来
def temp_convert(var):
    try:
        return int(var)
    except ValueError as argument:
        print ("参数没有包含数字\n", argument)

# 调用函数
temp_convert("xyz")

# 执行结果
"""
参数没有包含数字
invalid literal for int() with base 10: 'xyz'
"""

try...finally语句

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
    raise Exception
finally:
    print ("Error: 没有找到文件或读取文件失败")

"""
Error: 没有找到文件或读取文件失败
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
c:\Users\zhang'lei\Desktop\课题3.18\第十三次汇报\test.ipynb Cell 8' in <cell line: 1>()
      2     fh = open("testfile", "w")
      3     fh.write("这是一个测试文件,用于测试异常!!")
----> 4     raise Exception
      5 finally:
      6     print ("Error: 没有找到文件或读取文件失败")

Exception: 
"""

finally语句内容,是当退出整个try流程时会运行的语句,比如上面的输出的流程是:

try语句中遇到了一个Exception异常,会找该try流程中的except语句,没有找到,此时会退出整个try流程,因此执行finally语句,然后找上级try语句,也没找到,此时异常会被递交到最上层,终止程序打印错误

try...except...else...finally语句

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
    # raise Exception
except IOError:
    print('出现读写错误')
else:
    print('写入成功')
finally:
    print ("我要退出这个try流程了")

"""
写入成功
我要退出这个try流程了
"""

else可以和finally同时执行,但是except语句不能和else同时执行

rais可以用于主动触发异常

rais后面接上异常名称即可,或者自己传入参数,相当于实例化一个异常对象,Exception是常规错误基类

raise Exception(字符串或者对象实例)

def mye( level ):
    if level < 1:
        raise Exception("Invalid level!")
        # 触发异常后,后面的代码就不会再执行
try:
    mye(0)            # 触发异常
except Exception as err:
    print (1,err)
else:
    print (2)
 
"""
1 Invalid level!
"""

用户自定义异常

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是通过直接或间接的方式继承自BaseException类(所有异常的基类)。以下为与Exception常规错误基类相关的例子,其中创建了一个类,继承自Exception

class Networkerror(Exception):
    def __init__(self,ErrorInfo):
        super().__init__(self)  # 初始化父类
        self.errorinfo=ErrorInfo
        
    def __str__(self):
        return self.errorinfo  # 打印该异常时就相当于打印self.errorinfo
        
try:
    raise Networkerror("Bad hostname")
except Networkerror as e:
    print (e.errorinfo)
    
"""
Bad hostname
"""

assert断言语句

assert后面接一个表达式,如果表达式为真则执行后面的代码,否则触发名为AssertionError异常

assert expression, 参数  # 也可以不跟参数
# 等价于
if not excepression:
    rais AssertionError(参数)
    
assert 1==2, '1不等于2'
"""
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
c:\Users\zhang'lei\Desktop\课题3.18\第十三次汇报\test.ipynb Cell 11' in <cell line: 1>()
----> 1 assert 1==2, '1不等于2'

AssertionError: 1不等于2
"""
posted @ 2022-04-19 15:49  rain-1227  阅读(87)  评论(0编辑  收藏  举报