Python中错误和异常处理

(一)错误和异常概念

错误和异常处理的大纲:

错误和异常概念

常见错误

异常处理(try_except使用及else使用,截获异常,try_finaly使用,异常处理综合使用)

with...as语句与上下文管理

标准异常和自定义异常

raise和assert语句


错误和异常的概念:

错误:

1,语法错误:代码不符合解释器或编译器语法

2,逻辑错误:不完整或不合法输入或计算出现问题(比如传参时候参数不合理,

或者除零操作)

异常:执行过程中出现问题导致程序无法执行

1,程序遇到逻辑或者算法问题

2,运行过程中计算机错误(内存不够或者IO错误,例:因磁盘损坏导致访问文件失败)


错误和异常区别

错误:

代码运行前的语法或者逻辑错误

语法错误在执行前修改,逻辑错误无法修改

异常分为两个步骤:

1,异常产生,检查到错误且解释器认为是异常,抛出异常

2,异常处理,截获异常,忽略或者终止程序处理异常


(二)错误和异常的处理方法

2.1 python常见错误

常见错误:

1,a:NameError 未定义就使用变量


2,if True :SyntaxError 语法错误


3,f=open('1.txt'):IOErroe  打开不存在文件时的错误


4,10/0 :ZeroDivisionError 除数为零的错误


5,a=int('dd') :ValueError  进行类型转换的时候发生的错误


6,键盘中断错误



2.2 Python使用try_except处理异常

try-except:异常处理 

try:
    try_suit  #想要处理的代码块
except Exception [e]:   # Except设置异常的类,[e]变量保存出现异常的类型
    exception_block	    #处理捕获的异常
1,try用来捕获try_suite中的错误,并将错误交给except处理

2,except用来处理异常,如果处理异常和设置捕获异常一致,使用exception_block处理异常,

否则交给Python解释器或系统处理异常,变量[e]用来保存错误信息

小栗子:

try:
    a
except NameError as err: #将异常信息转存到变量err中
    print("catch Error:",err)
print("error is print ")

try-except捕获异常分析:

代码块1

try:
    undef
except : 
    print"catch an except"
代码块2

try:
    if undef
except : 
    print"catch an except"

代码块1:可以捕获异常,因为是运行时错误

代码块2,不能捕获异常,以为是语法错误,运行前错误

代码块2是在编译成二进制文件时因语法错误而无法生成二进制文件,代码并未执行


代码块3:

try:
    undef
except NameError as e : 
    print("catch an except",e)
代码块4:

try:
    undef
except IOError as e : 
    print("catch an except",e)

代码块3:可以捕获异常,因为设置捕获NameError异常

代码块4:不可以捕获异常,因为设置IOError,不会处理NameError,会交给Python处理异常,Python解释器的处理方式就是终止程序运行


try-except用例:

需求:猜数字游戏

1,开始游戏产生一个1~100随机数

2,用户输入,游戏根据输入值提示大或者小

3,用户根据提示继续输入,直到猜中位置

4,如果用户输入错误,程序可以处理异常

import  random
num=random.randint(0,100)

while True:
    try:
        guess=int(input("Enter 1~100"))
    except ValueError as e:
        print("Enter 1~100")
    if guess > num:
        print("guess Bigger:",guess)
    elif guess < num:
        print("guess Smaller:",guess)
    else:
        print("Guess OK")
        break
    print("\n")

注意几点:python3中读取键盘输入是input()函数,将错误信息复制给变量使用as关键字 


try-except捕获多个异常

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise
上面是Python官方教程中的捕获多个异常的示例。

使用多个except可以处理多个异常类


try-except--else使用:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print('cannot open', arg)
    else:
        print(arg, 'has', len(f.readlines()), 'lines')
        f.close()
上面是python官方教程示例。

如果没有异常,执行else语句中的代码


2.3 try-finally语句:

语法格式:

try:

    try_suite

finally:

    do_finally

1,如果try语句没有捕获错误,代码执行do_finally语句

2,如果try语句捕获错误,程序首先执行do_finally语句,然后将捕获到的错误交给python解释器处理

try-finally语句不是用来处理异常的,而是用来做清理工作的。

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
规则:try-finally无论是否检测到异常,都会执行finally代码

作用:为异常处理事件提供清理机制,用来关闭文件或者释放系统资源。


2.4 python中try-except-else-finally语句

try-except-finally使用:

try:

    try_suite

except:

    do_except

finally:

    do_finally

1,若try语句没有捕获异常,执行完try代码段后,直接执行finally语句

2,若try捕获异常,首先执行except处理错误,然后执行finally语句

try-except-else-finally使用:

try:

    try_suite

except:

    do_except

else:

    do_else

finally:

    do_finally

1,若try没有捕获异常,执行完try代码块后,执行else代码段,最后执行finally

2,若try捕获异常,首先执行except处理错误,然后执行finally

>>> def divide(x, y):
...     try:
...         result = x / y
...     except ZeroDivisionError:
...         print("division by zero!")
...     else:
...         print("result is", result)
...     finally:
...         print("executing finally clause")
...
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
以上是python官方教程示例


2.5 python中的with语句

语法格式:

with context [as var]:

    with_suite

1,with语句用来代替try-except_finally语句,使代码更简洁

2,context表达式返回是一个对象

3,var用来保存context返回对象,单个返回值或元组
4,with_suite就是使用var变量来对context返回对象进行操作

with语句实例:

with open('1.txt') as f:

    for line in f.readlines()

        print(line)

1,打开1.txt文件

2,f变量接收文件对象返回的对象

3,with中的代码块执行完成后关闭文件

with语句实质是上下文管理:

1,上下文管理协议:包含方法__enter__()和__exit__(),支持该协议的对象要事先这两个方法

2,上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作

3,进入上下文管理器:调用管理器__enter__方法,如果设置as var 语句,var变量接收__enter__()方法返回值

4,退出上下文管理器:(代码执行完成,或出现异常)调用管理器__exit__方法,对资源进行清理,对文件进行关闭

with语句应用场景:

1,文件操作

2,进程线程之间互斥对象,例如互斥锁

3,支持上下文的其他对象


(三)Python标准异常和自定义异常

3.1 python中raise语句和assert语句

raise语句:

raise语句用于主动抛出异常(使代码终止运行)

语法格式:raise [exception[,args]]

exception:异常类

args:描述异常信息的元组

raise exception (arg) #python3

assert语句:

断言语句:assert语句用于检测表达式是否为真,如果为假,引发AssertionError错误

语法格式:assert exception [,args]

exception:表达式

args:判断条件的描述信息

assert exception (args)

应用:对传入的参数进行判断


理解不透彻,后续会更新



你可能感兴趣的:(python,异常处理,python,异常)