python 用 异常对象(exception object)来表示异常情况。异常对象可以被处理、捕获,避免程序终止执行

  1. Exception 所有异常的基类
  2. AttributeError 特征引用或者赋值失败时引发的
  3. IOError 试图打在不存在的文件(包括其他情况)
  4. IndexError 使用序列中不存在的索引
  5. KeyError 使用映射中不存在的键
  6. NameError 找不到名字(变量)
  7. SyntaxError 在代码为错误形式时引发
  8. SystemExit 系统异常退出
  9. TypeError 在内建操作或者函数应用与错误类型的对象时
  10. ValueError 正确的类型对象,但是对象使用不合适的值
  11. ZeroDivisionError 除法,第二参数为0

自定义异常

可以创建一个新的exception类来拥有自己的异常。异常应该继承自 Exception 类,或者直接继承,或者间接继承

class MyError(Exception):
    pass
#自定义异常也可以在类里面定义方法

捕捉异常

  • 基本语法:

    try:
      #需要执行的操作
    except 异常类 as e:
      #如果发生异常,执行以下代码
    else:
      #如果没有发生异常,执行的命令
    finally:
      #无论如何,都要执行的代码
    
  • 注意 except as e 的写法,e 是一个变量,记录了异常的类,可以用 print 函数打印出来

  • except 后面的异常类,建议写 Exception,这样就一定能捕获到异常。
  • 捕获到异常,就不会去执行 else 模块
  • 示例:
try:
    name = input('Please input your name: ')
    print('Hello %s' %name)
    print(10/0)
except Exception as e:
    print('Got an error ', e)
finally:
    print('Game over')

捕获多个异常

  • 方法一(不同异常不同处理方式):
try:
    需要执行的操作
except 异常类 as e:
    如果发生异常,执行以下代码
except 异常类 as f:
    如果发生异常,执行以下代码
else:
    如果没有发生异常,执行的命令
finally:
    无论如何,都要执行的代码
  • except 后面的异常类,如果无需指定,直接写 Exception 即可。
  • 如果需要明确指定异常的类,而且是多个类的情况下,可以使用多个 except 语句。
  • 方法二(多个异常统一处理):
try:
    需要执行的操作
except (异常类1,异常2,异常3) as e:
    如果发生异常,执行以下代码
else:
    如果没有发生异常,执行的命令
finally:
    无论如何,都要执行的代码

抛出异常

  • raise 关键字可以自主抛出异常,规则如下:

    raise NameError([str])

  • raise 后面跟异常的类,类括号里面,可以指定要抛出的异常示例,约详细越好

>>> raise NameError()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError
>>> raise NameError('bad name')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: bad name
raise 如果用在 try / except 语句中,那么会直接抛出异常,并终止程序运行。不影响 finally 语句的执行。

raise 如果用在 try / except 语句中,那么会直接抛出异常,并终止程序运行。不影响 finally 语句的执行。

while True:
    try:
        a = input('Plase input a number: ')
        b = input('Plase input a number: ')
        print(a/b)
    except Exception as e:
        print('Error happend, please do agin')
        raise e
    else:
        print('No error happend')

异常实现循环

  • 在循环没有异常的情况下,才会退出循环。
while True:
    try:
        a = input('Plase input a number: ')
        b = input('Plase input a number: ')
        print(a/b)
    except Exception as e:
        print('Error happend, please do agin')
        print(e)
    else:
        print('No error happend')