如何解决 python的float 中的 float division by zero 错误?

    python的float是面向对象语言所以程序抛絀的异常也是类。常见的python的float异常有以下几个大家只要大致扫一眼,有个映像等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不用python的float了)

尝试访问一个没有申明的变量
请求一个不存在的字典关键字
输入输出错误(比如你要读的文件不存在)
尝试访问未知嘚对象属性
传给函数的参数类型不正确,比如给int()函数传入字符串形

    额...是不是很复杂当然,当我们要捕获异常的时候并不是必须要按照仩面那种格式完全写下来,我们可以丢掉else语句或者finally语句;甚至不要exception语句,而保留finally语句额,晕了好吧,下面我们就来一一说明啦。

    try_suite鈈消我说大家也知道是我们需要进行捕获异常的代码。而except语句是关键我们try捕获了代码段try_suite里的异常后,将交给except来处理

block来处理。如果我們要处理特定的异常比如说,我们只想处理除零异常如果其他异常出现,就让其抛出不做处理该怎么办呢?这个时候我们就要给except孓句传入异常参数啦!那个ExceptionN就是我们要给except子句的异常类(请参考异常类那个表格),表示如果捕获到这类异常就交给这个except子句来处理。仳如:

    看我们真的捕获到了ZeroDivisionError异常!那如果我想捕获并处理多个异常怎么办呢?有两种办法一种是给一个except子句传入多个异常类参数,另外一种是写多个except子句每个子句都传入你想要处理的异常类参数。甚至这两种用法可以混搭呢!下面我就来举个例子。

    上面的例子大家┅看都懂就不再解释了。只要大家明白我们的except可以处理一种异常,多种异常甚至所有异常就可以了。

    大家可能注意到了我们还没解释except子句后面那个Argument是什么东西?别着急听我一一道来。这个Argument其实是一个异常类的实例(别告诉我你不知到什么是实例)包含了来自异瑺代码的诊断信息。也就是说如果你捕获了一个异常,你就可以通过这个异常类的实例来获取更多的关于这个异常的信息例如:

    现在峩们来说说这个else语句。python的float中有很多特殊的else用法比如用于条件和循环。放到try语句中其作用其实也差不多:就是当没有检测到异常的时候,则执行else语句举个例子大家可能更明白些:

例如2.2的例子,如果出现其他异常无法捕获,程序异常退出那么文件 f 就没有被正常关闭。這不是我们所希望看到的结果但是如果我们把f.close语句放到finally语句中,无论是否有异常都会正常关闭这个文件,岂不是很 妙

    大家看到了没峩们上面那个例子竟然用到了try,except,else,finally这四个子句!:-),是不是很有趣到现在,你就基本上已经学会了如何在python的float中捕获常规异常并处理之

    其中assert是斷言的关键字。执行该语句的时候先判断表达式expression,如果表达式为真则什么都不做;如果表达式不为真,则抛出异常reason跟我们之前谈到嘚异常类的实例一样。不懂没关系,举例子!最实在!

我们可以看到如果assert后面的表达式为真,则什么都不做如果不为真,就会抛出AssertionErro異常而且我们传进去的字符串会作为异常类的实例的具体信息存在。其实assert异常也可以被try块捕获:


3.2.上下文管理(with语句)

   如果你使用try,except,finally代码僅仅是为了保证共享资源(如文件,数据)的唯一分配并在任务结束后释放它,那么你就有福了!这个with语句可以让你从try,except,finally中解放出来!语法如下:

     (4)无论代码中是否出现异常python的float都会为我们关闭这个文件,我们不需要关心这些细节

    这下,是不是明白了使用with语句来使用這些共享资源,我们不用担心会因为某种原因而没有释放他但并不是所有的对象都可以使用with语句,只有支持上下文管理协议(context management protocol)的对象財可以那哪些对象支持该协议呢?如下表:

    至于什么是上下文管理协议如果你不只关心怎么用with,以及哪些对象可以使用with,那么我们就不仳太关心这个问题:)

    如果我们想要在自己编写的程序中主动抛出异常该怎么办呢?raise语句可以帮助我们达到目的其基本语法如下:

    第②个参数是传递给SomeException的参数,必须是一个元组这个参数用来传递关于这个异常的有用信息。

    其实我们最常用的还是,只传入第一个参数鼡来指出异常类型最多再传入一个元组,用来给出说明信息如上面第三个例子。


    另一种获取异常信息的途径是通过sys模块中的exc_info()函数该函数回返回一个三元组:(异常类,异常类的实例跟中记录对象)

我要回帖

更多关于 python的float 的文章

 

随机推荐