2019实战第二期-异常读书打卡

-----学习《Python基础教程第3版》读书笔记-----

2019实战第二期-异常读书打卡

异常是什么

使用异常对象表示异常状态,并在遇到错误时引发异常。异常对象未被处理,程序将终止并显示一条错误信息(traceback)

让事情沿你指定的轨道出错

出现问题时,将自动引发异常。

raise语句
raise Exception
raise Exception('hyperdrive overload')
1553348797317.png

虽然内置异常涉及的范围很广,能够满足很多需求,但有时你可能想自己创建异常类。

那么如何创建异常类呢?就像创建其他类一样,但务必直接或间接地继承 Exception (这意味着从任何内置异常类派生都可以)。因此,自定义异常类的代码类似于下面这样:
class SomeCustomException(Exception): pass
捕获异常

异常比较有趣的地方是可对其进行处理,通常称之为捕获异常。为此,可使用try / except 语句。

try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except ZeroDivisionError:
    print("The second number can't be zero!")
异常和函数
不提供参数
class MuffledCalculator:
    muffled = False
    def calc(self, expr):
        try:
            return eval(expr)
        except ZeroDivisionError:
            if self.muffled:
                print('Division by zero is illegal')
            else:
                raise
多个except
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except ZeroDivisionError:
    print("The second number can't be zero!")
except TypeError:
    print("That wasn't a number, was it?")
捕获多个异常
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except (ZeroDivisionError, TypeError, NameError):
    print('Your numbers were bogus ...')
捕获对象
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except (ZeroDivisionError, TypeError) as e:
    print(e)
捕获所有异常
try:
    x = int(input('Enter the first number: '))
    y = int(input('Enter the second number: '))
    print(x / y)
except:
    print('Something wrong happened ...')
万事大吉
while True:
    try:
        x = int(input('Enter the first number: '))
        y = int(input('Enter the second number: '))
        value = x / y
        print('x / y is', value)
    except Exception as e:
        print('Invalid input:', e)
        print('Please try again')
    else:
        break
加finally
try:
    1 / 0
except NameError:
    print("Unknown variable")
else:
    print("That went well!")
finally:
    print("Cleaning up.")

异常和函数有着天然的联系。如果不处理函数中引发的异常,它将向上传播到调用函数的地方。如果在那里也未得到处理,异常将继续传播,直至到达主程序(全局作用域)。如果主程序中也没有异常处理程序,程序将终止并显示栈跟踪消息。

>>> def faulty():
... raise Exception('Something is wrong')
...
>>> def ignore_exception():
... faulty()
...
>>> def handle_exception():
... try:
...  faulty()
...  except:
...  print('Exception handled')
...
>>> ignore_exception()
Traceback (most recent call last):
File '', line 1, in ?
File '', line 2, in ignore_exception
File '', line 2, in faulty
Exception: Something is wrong
>>> handle_exception()
Exception handled
异常之禅
def describe_person(person):
    print('Description of', person['name'])
    print('Age:', person['age'])
    try:
        print('Occupation:', person['occupation'])
    except KeyError: pass
不那么异常的情况

只是发出警告,指出情况偏离了正轨

>>> from warnings import warn
>>> warn("I've got a bad feeling about this.")
__main__:1: UserWarning: I've got a bad feeling about this.

>>> filterwarnings("error")
>>> warn("This function is really old...", DeprecationWarning)
Traceback (most recent call last):
File "", line 1, in 
DeprecationWarning: This function is really old...
>>> filterwarnings("ignore", category=DeprecationWarning)
>>> warn("Another deprecation warning.", DeprecationWarning)
>>> warn("Something else.")
Traceback (most recent call last):
File "", line 1, in 
UserWarning: Something else.

你可能感兴趣的:(2019实战第二期-异常读书打卡)