1.try-except
try except组合是用来处理异常的一对黄金搭档,python中也不例外。可以看个简单的例子:
def t1():try:a, b = 1.0, "2.0"c = a / float(b)print("c is: ", c)except ValueError as err:print("b must be digit!")except ZeroDivisionError as err:print("b is zero!")except Exception as ex:print("there is unexpect exception!")
上面两个数相除的例子,首先,如果b的值是"abc",会抛出一个ValueError的异常:could not convert string to float: 'abc'
,该异常被except ValueError as err
捕获。其次,如果b的值是"0.0",会抛出一个ZeroDivisionError的异常:ZeroDivisionError: float division by zero
,该异常被except ZeroDivisionError as err:
捕获。最后,如果还有其他异常,则被最后一句except语句捕获。
2.raise
上面的例子中,都是被动接受处理异常。自然我们也可以主动抛出异常,这个时候就用到了raise关键字。
相比被动接受处理异常,主动抛出异常的好处自然很多。
1.使用方式更为灵活,可以根据我们的业务场景,业务需求,来定义虽然代码语法上准确无误,但不满足我们要求的情况为异常情况。
2.可以自定义异常报错信息,方便我们发现与排查问题。
raise常见的用法有以下三种
1.只有一个raise关键字,可以引发当前捕获的异常。
def t1():try:x = "x"x = float(x)except:raise
执行这段代码,会有如下输出:
ValueError: could not convert string to float: 'x'
2.raise + 异常类信息,表示引发异常的类型。
def t1():try:x = "x"x = float(x)except:raise ValueError()
执行上述代码,有如下输出:
ValueError
如果将上面的代码稍作修改:
def t1():try:x = "x"x = float(x)except:raise ZeroDivisionError()
上面的代码则会输出如下:
ValueError: could not convert string to float: 'x'During handling of the above exception, another exception occurred:...ZeroDivisionError
上面的例子,float(x)转化的时候,系统抛出了一个ValueError的异常,但是因为我们raise的时候,指定的是ZeroDivisionError,所以还会抛出来一个ZeroDivisionError。
3.raise + 异常类型 + 描述信息
def t1():x = "a"if not x.isdigit():raise ValueError("x must be digit!")
上面代码运行,则会输出如下信息:
ValueError: x must be digit!
3.try-except捕获raise异常
raise出来异常以后,我们经常还用try except对异常进行捕获
def t1():try:x = "a"if not x.isdigit():raise ValueError("x must be a num!")except Exception as ex:print("there is exception: ", repr(ex))
上面的代码运行结果如下
there is exception: ValueError('x must be a num!')
4.assert
assert是用来表明某个条件为真,当assert语句失败返回False的时候,会抛出AssertionError。
看个简单的实例
def t3():a = 2assert a > 5print(a ** 2)
此时代码会抛出异常
AssertionError
如果将a赋值为10,代码会输出100。
assert本质上还是raise一个AssertionError,所以我们也可以使用try-catch来捕获这个异常,而不是让这段code直接崩溃。
def sqrt(x):try:assert x >= 0num = math.sqrt(x)print("num is: ", num)except:print("if you want to solve sqrt num, x must be bigger or equal zero!")sqrt(4)sqrt(-4)
num is: 2.0if you want to solve sqrt num, x must be bigger or equal zero!