Python 语言及其应用 Chapter_4_Note_6 异常处理

异常处理这个章节我在前面就接触过,不过没明白为什么要这么去做捕获,anyway我们先来记录下


使用try和except处理错误
要么做,要么不做,没有尝试这回事。
——尤达(Yoda)
在一些编程语言中,错误是通过特殊的函数返回值指出的,而Python 使用异常,它是一段

只有错误发生时执行的代码。
之前已经接触到一些有关错误的例子,例如读取列表或者元组的越界位置或者字典中不存
在的键。所以,当你执行可能出错的代码时,需要适当的异常处理程序用于阻止潜在的错
误发生。
在异常可能发生的地方添加异常处理程序,对于用户明确错误是一种好方法。即使不会及
时解决问题,至少会记录运行环境并且停止程序执行。如果发生在某些函数中的异常不能
被立刻捕捉,它会持续,直到被某个调用函数的异常处理程序所捕捉。在你不能提供自己
的异常捕获代码时,Python 会输出错误消息和关于错误发生处的信息,然后终止程序,例
如下面的代码段:
>>> short_list = [1, 2, 3]
>>> position = 5
>>> short_list[position]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

与其让错误随机产生,不如使用try 和except 提供错误处理程序:
>>> short_list = [1, 2, 3]
>>> position = 5
>>> try:
... short_list[position]
... except:
... print('Need a position between 0 and', len(short_list)-1, ' but got',
... position)
...
Need a position between 0 and 2 but got 5
在try 中的代码块会被执行。如果存在错误,就会抛出异常,然后执行except 中的代码;
否则,跳过except 块代码。
像前面那样指定一个无参数的except 适用于任何异常类型。如果可能发生多种类型的异
常,最好是分开进行异常处理。当然,没人强迫你这么做,你可以使一个except 去捕捉所
有的异常,但是这样的处理方式会比较泛化(类似于直接输出发生了一个错误)。
当然也
可以使用任意数量的异常处理程序。
有时需要除了异常类型以外其他的异常细节,可以使用下面的格式获取整个异常对象:
except exceptiontype as name

下面的例子首先会寻找是否有IndexError,因为它是由索引一个序列的非法位置抛出的异
常类型。将一个IndexError 异常赋给变量err,把其他的异常赋给变量other。示例中会
输出所有存储在other 中的该对象的异常。
>>> short_list = [1, 2, 3]
>>> while True:
... value = input('Position [q to quit]? ')
... if value == 'q':
... break

... try:
... position = int(value)
... print(short_list[position])
... except IndexError as err:           #这一句,将索引造成的错误,分配给了err,等于给变量err赋了个值
... print('Bad index:', position)
... except Exception as other:       #这一句,将剩下的其他错误,分配给了other
... print('Something else broke:', other)
...                                                    #下面就是针对不同的情况进行测试
Position [q to quit]? 1
2
Position [q to quit]? 0
1
Position [q to quit]? 2
3
Position [q to quit]? 3
Bad index: 3
Position [q to quit]? 2
3
Position [q to quit]? two
Something else broke: invalid literal for int() with base 10: 'two'
Position [q to quit]? q
输入3 会抛出异常IndexError;输入two 会使函数int() 抛出异常,被第二个except 所捕获。

编写自己的异常
前面一节讨论了异常处理,但是其中讲到的所有异常(例如IndexError)都是在Python 或
者它的标准库中提前定义好的。根据自己的目的可以使用任意的异常类型,同时也可以自
己定义异常类型,用来处理程序中可能会出现的特殊情况。
这里需要定义一个类的新对象,这会在第6 章深入说明。如果你对类不是很
熟悉,可以学完后面的部分再返回这一节。
一个异常是一个类,即类Exception 的一个子类。现在编写异常UppercaseException,在
一个字符串中碰到大写字母会被抛出。
>>> class UppercaseException(Exception):
... pass
...
>>> words = ['eeenie', 'meenie', 'miny', 'MO']
>>> for word in words:
... if word.isupper():
... raise UppercaseException(word)
...
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
__main__.UppercaseException: MO
即使没有定义UppercaseException 的行为(注意到只使用pass),也可以通过继承其父类

Exception 在抛出异常时输出错误提示。
你当然能够访问异常对象本身,并且输出它:
>>> try:
... raise OopsException('panic')
... except OopsException as exc:
... print(exc)
...
panic




最后贴一下Python官方的错误类型从属表

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值