java程序员的python之路(异常)

异常

在编写代码的过程中,难免会遇到一些错误,包括语法错误和异常。语法错误IDE会帮助我们处理,但是异常就不得不我们自己处理,比如下面这段代码:

a = 2/0
print("hello")

运行之后,会报出以下异常:

Traceback (most recent call last):
  File "E:\workspace-python\firstpython\main.py", line 4, in <module>
    a = 2/0
ZeroDivisionError: division by zero

这个异常说明,模块main.py的第4行有一个ZeroDivisionError错误,也就是除数不能为0.类似这样的错误,我们就称作异常,也就是程序出现错误了。从上面的输出我们看到hello并没有打印出来,可见出现异常的时候,程序将会停止执行。这对线上的项目是很致命的。但是我们又不能百分之百的说线上的项目不会出现异常。那么当出现异常的时候,我们应该怎么处理呢?

异常处理

为了使得在出现异常的情况下,我们的代码还能正确执行,那么我们就需要做异常处理。python的异常处理方式和java非常相似,java中使用 try…catch…finally throw throws等关键字来处理异常,与之对应的python中有try…except…finally raise. python的方法上并不需要添加抛出的异常信息。代码如下:

try:
    a = 2/0
except Exception as e:
    print(e)

print("hello")

执行代码,输出如下:

division by zero
hello

hello被打印了出来,说明我们处理异常成功。说名一下异常处理的流程:

  • 首先,执行try子句(在关键字try和关键字except之间的语句)
  • 如果没有异常发生,忽略except子句,try子句执行后结束。
  • 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
  • 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中

    一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行,像下面这样:

try:
    a = 2/0
except TypeError as e:
    print(e)
except NameError as e:
    print(e)
except ZeroDivisionError as e:
    print(e)
print("hello")

也可以像下面这样:

try:
    a = 2/0
except (TypeError,NameError,ZeroDivisionError) as e:
    print(e)
print("hello")

抛出异常

如果程序发生了异常,也捕捉到了异常,但是此处不需要处理,而在外层调用的地方处理此异常,我们就可以使用raise抛出异常,像下面这样:

def hello():
    try:
        a = 2/0
    except (TypeError,NameError,ZeroDivisionError) as e:
        raise e

try:
    hello()
except Exception as e:
    print(e)

print("hello")

输出结果如下:

division by zero
hello

finally

在碰到需要关闭资源的时候,如果发生了异常,那么会出现资源没有被关闭的错误。这时候就需要用到finally结构,定义在finally中的代码,不管异常是否发生,总会执行,所以可以把关闭资源的代码写在finally块中。代码如下:

def hello():
    try:
        a = 2/0
    except (TypeError,NameError,ZeroDivisionError) as e:
        raise e

try:
    hello()
except Exception as e:
    print(e)
finally:
    print("close")

print("hello")

输出结果如下:
division by zero
close
hello

自定义异常

除了标准的异常,我们也可以自定义自己的异常类,使得异常更灵活,代码如下:

class myError(Exception):
    def __init__(self,value):
        self.value = value


    def __str__(self):
        return repr(self.value)




try:
    raise myError("Error hello")
except myError as e:
    print(e.value)
finally:
    print("finally")

输出结果如下:

Error hello
finally
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值