MIT 6.001X 2016 (7,8)检查 调试 异常 断言

try:

except:

有try 必须有except  不然会有EOFError






else:  当try里面的东西都完美的执行了之后干的事情

finally: 不管有没有出bug 都会执行





raise:






习题错误

(1)

def fancy_divide(numbers,index):
    try:
        denom = numbers[index]
        for i in range(len(numbers)):
            numbers[i] /= denom
    except IndexError:
        print("-1")
    else:
        print("1")
    finally:
        print("0")

当 输入 是 fancy_divide([0, 2, 4], 0)

输出是 0, error   因为 程序先进入 try 然后在try里碰见了 error 跳出来 看见 IndexError  不过这里的error 不是 indexerror 而是ZeroDivisionError  所以不执行 print('-1')  然后往下 因为try没成功 所以else 也不执行 ,然后finally 执行 输出 0  然后还输出ZeroDivisionError


(2)

def fancy_divide(numbers, index):
    try:
        denom = numbers[index]
        for i in range(len(numbers)):
            numbers[i] /= denom
    except IndexError:
        fancy_divide(numbers, len(numbers) - 1)
    except ZeroDivisionError:
        print("-2")
    else:
        print("1")
    finally:
        print("0")

当输入是fancy_divide([0, 2, 4], 0)  的时候, 输出是 1 0 0 我当时以为是1 0  

因为 程序在try 的时候碰见了 indexerror  然后跳出来 去了第一个except 执行 fancy_divide(numbers, len(numbers) - 1)  

这什么意思呢?就是说程序在这里干了 fancy_divide(numbers, len(numbers) - 1) 的事情 ,而fancy_divide(numbers, len(numbers) - 1)干的 事件就是 输出了 1 0  因为 fancy_divide(numbers, len(numbers) - 1) try成功了 。

但是 程序还没完  还要继续往下走 ,我当时就是没想到这一点,因为程序 出现了 error 所以 else 不执行  finally  执行了  所以又输出了 0  

所以最终结果是 1 0 0 

(3)

def fancy_divide(numbers, index):
    try:
        try:
            denom = numbers[index]
            for i in range(len(numbers)):
                numbers[i] /= denom
        except IndexError:
            fancy_divide(numbers, len(numbers) - 1)
        else:
            print("1")
        finally:
            print("0")
    except ZeroDivisionError:
        print("-2")

fancy_divide([0, 2, 4], 4)  输出的是 1 0 0  这里就不解释了 

fancy_divide([0, 2, 4], 0)  输出的是 0 -2  我当时以为就是 0   ,那为什么是 0 -2  先看里面的try,   try遇见了 一个ZeroDivisonError 所以 输出了 0  ZeroDivisonError  但是外面还有个try 有个except 而这个except 的error 正好是 Zero...Error  所以 zero这个error就不输出了 而是输出了 0 -2


try声明的工作原理如下。

  • 首先,执行try子句try和 except关键字之间的语句)。
  • 如果没有发生异常,则会跳过except子句try结束语句的执行 
  • 如果在执行try子句期间发生异常,则跳过子句的其余部分。然后,如果它的类型匹配以except关键字命名的异常 ,则会执行except子句,然后在try语句后继续执行
  • 如果发生与except子句中指定的异常不匹配的异常,则将其传递给外部try语句; 如果没有找到处理程序,则它是一个未处理的异常,并执行停止并显示如上所示的消息。

a = 1/0

这个程序会引发 error

ZeroDivisionError: division by zero  

注意后面的 division by zero  

def fancy_divide(list_of_numbers, index):
    try:
        try:
            raise Exception("0")
        finally:
            denom = list_of_numbers[index]
            for i in range(len(list_of_numbers)):
            list_of_numbers[i] /= denom
    except Exception as ex:
        print(ex)
        

fancy_divide([0, 2, 4], 0)  输出什么呢?    

首先 第一个 try  然后第二个try  抛出了 一个 exception (异常)   假如没有后面这些乱七八糟的 ,具体看下图:

def f():
        try:
            raise Exception("0")
        except TypeError:
            print(1)

这时候  会  输出 Exception: 0    因为try抛出了  Exception: 0 而且 这个异常不是typeerror  所以是 Exception: 0


继续上面的  执行 finally  finally 也有个异常  ZeroDivisionError:division by zero    然后 这个新来的异常 会代替 旧的那个 0  异常  然后 跳到外面的那个try 对应的except   而这里 

 except Exception as ex:

就是把Exception 绑定的 那个 冒号后面的那个东西 绑定给了 ex   因为exception  也是一个objection  (类)

    

An exception is an object like any other (so the thing ex is a name bound to an instance of that class) and the name of that instance is what is being passed.

See the detailed example at the end of 8.3

How is ex stored? Its an object like any other so it exists in this scope until it is garbage collected (because nothing uses it any more).

这是 助教 底下的评论   所以 这个 ex就是 division  by zero  

这里要说的就是 新的 exception会代替 旧的exception  

try:
    raise Exception("5")
    try:
        raise Exception("5")

    finally:
        a = 1/0
        print('finally')
except Exception as e:
    print('yes', e)        

而这个例子 里  就输出了 yes 5     (注意  程序里的那个5 有没有引号 都可以 ,有引号就是字符串 没有就是数字 我猜的 ,不过结果 都是 Exception:5)     

这里的例子就是因为第一个try 直接 有个异常 所以里面的try等等东西 都 不执行了 直接去 最后那个excep了


assert (断言):



当 not len(grades) ==0  是true 的时候 就执行 下面的   如果是false 的话就执行  返回 assertionerror  还会输出 'no grades data'





pre/post condition :

Pre and Post refer to time. So pre- means before the event and post- means after the event.

Because the input is the state of the data before the event it is pre-processing

Because the output is the state of the data after the event it is post-processing

所以 跟输入有关的就是 pre condition  跟输出有关的就是 post condition



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值