Python进阶-异常处理

一、什么是异常

异常就是程序运行时发生错误的信号,在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止,在python中,错误有如下两种:

1、语法错误
  即代码语句不符合python语法规范,比如if语句缺少冒号,print语句缺少括号等。这种语法错误会被python解释器语法检测出来,导致程序无法正常运行,所以必须在程序执行前就改正该类错误。
2、逻辑错误

#TypeError:int类型不可迭代
for i in 3:
    pass
#ValueError
num=input(">>: ") #输入hello
int(num)

#NameError
aaa

#IndexError
l=['egon','aa']
l[3]

#KeyError
dic={'name':'egon'}
dic['age']

#AttributeError
class Foo:pass
Foo.x

#ZeroDivisionError:无法完成计算
res1=1/0
res2=1+'str'

二、异常种类

python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,一个异常标识一种错误。
常见的异常种类:

1、如果错误发生的条件是可预知的,我们需要用if进行处理:在错误发生之前进行预防。

AGE=10
while True:
    age=input('>>: ').strip()
    if age.isdigit():
    #只有在age为字符串形式的整数时,下列代码才不会出错,该条件是可预知的
        age=int(age)
        if age == AGE:
            print('you got it')
            break

2、如果错误发生的条件是不可预知的,则需要用到try...except:在错误发生之后进行处理。try中发现错误会传递给except,所以发生try中发生异常后的语句不会执行。

#基本语法为
try:
    被检测的代码块
except 异常类型:
    try中一旦检测到异常,就执行这个位置的逻辑

#例子
try:
    f=open('a.txt')
    g=(line.strip() for line in f)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
except StopIteration:
    f.close()

3、万能异常
  如果在except后面直接写明具体异常种类,程序遇到其他的异常,则except就不能发挥捕获异常的功能。所以可以用"Exception",万能异常来捕获。

#例子:
try:
    age = int(input('>>>'))
    l = []
    l[10]

except Exception as e:
    print(e)

4、多分支异常与万能异常
  4.1 如果无论出现什么异常,我们统一丢弃,或者使用同一段代码逻辑去处理他们,只有一个Exception就足够了。
  4.2 如果你想要的效果是,对于不同的异常我们需要定制不同的处理逻辑,那就需要用到多分支了。
5、也可以在多分支后来一个Exception

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)

6、异常处理中的elsefinally

s1 = 'hello'
try:
    int(s1)
except IndexError as e:
    print(e)
except KeyError as e:
    print(e)
except ValueError as e:
    print(e)
except Exception as e:
   print(e)
else:
    print('try内代码块没有异常则执行我')
finally:
    print('无论异常与否,都会执行该模块,通常是进行清理工作')

7、通过raise主动触发异常

try:
    raise TypeError('类型错误')
except Exception as e:
    print(e)

8、自定义异常
  需要继承BaseException类

class EgonException(BaseException):
    def __init__(self,msg):
        self.msg=msg
    def __str__(self):
        return self.msg

try:
    raise EgonException('类型错误')
except EgonException as e:
    print(e)

9、断言:assert 条件

assert 1 == 1  
assert 1 == 2

四、总结try..except
  1 把错误处理和真正的工作分开来;
  2 代码更易组织,更清晰,复杂的工作任务更容易实现;
  3 毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了。

你可能感兴趣的:(Python进阶-异常处理)