异常 + 断言 + 一个类特殊成员__str__()

inp = input("input:")

try:
    num = int(inp)
    print(num)
except:
    print("fucked")

 

inp = input("input:")

try:
    num = int(inp)
    print(num)
except Exception as e:
    print(e)
Exception是一个错误表达,输入非字母时,比如"sss",报错,输出:invalid literal for int() with base 10: 'sss',而不是报错大红色"发生异常...."
这个print也可以自定义任何内容。
Excepttion可以捕捉所有错误,它可以换成其它捕捉具体类型的错误,比如ValueError、IndexError等:
inp = input("input:")
try:
    num = int(inp)
    print(num)
except ValueError as e:
    print(e)
这样就只能捕捉ValueError错误了,如果是发生ValueError会打印这个错误,其它错误发生则python报错大红色"发生异常....."

如果需要捕捉具体错误,但有时候捕捉的那个错误没发生,却发生了其它的错误,也需要捕捉,那就可以使用两次except:

inp = input("input:")

try:
    num = int(inp)
    print(num)
except ValueError as e:
    print(e)
except Exception as e:
    print(e)

这样如果发生ValueError错误,我们第一个可以捕捉到,下面的Exception就不会执行了。

异常的完整结构:

try:
    #主代码块
    pass
except ValueError as e:
    #异常发生时,执行该块
    pass
else:
    #主代码块执行完,执行该块
    pass
finally:
    #无论异常与否,最终执行该块
    pass

使用raise主动触发一个错误:

try:
    print("123")
    raise Exception("出错啦。。")
except Exception as e:
    print(e)

raise"出错啦。。"赋值给了Exception,然后触发了一个错误,使得代码执行'except Exception as e',e的值就是raise赋的'出错啦。。'

 

__str__()

Exception是一个对象,对其进行赋值后,为什么可以打印出内容呢,我们print一个对象,输出的内容是:<__main__.Foo object at 0x10e6787b8>这样的内存地址,

类中如果定义了__str__()方法,就会打印该方法下的return信息描述,注意是return,如果用print会出错。就是说当print一个对象时,自动执行__str__()方法下的return中的信息

class Foo:
    def __init__(self,arg):
        self.xo = arg
    
    def __str__(self):
        return self.xo

obj = Foo("出错啦")
print(obj)

输出:出错啦

 

断言:assert

assert a == b

assert关键字后面跟一个条件,条件成立则代码继续往下执行,不成立抛出异常
如果a == b ,程序继续往下执行,如果不等于,则报错,可用来测试

格式 : assert+空格+要判断语句+,+报错语句assert 1>5,"出错啦....."

 

 

posted @ 2018-10-04 16:46  greenfan  阅读(122)  评论(0)    收藏  举报