Python学习笔记(八)异常

8异常

8.1什么是异常

   Python用异常对象来表示异常情况。每一个异常都是一些类的实例,这些实例可以被印发,并且可以用很多种方法进行捕捉并且对其进行处理,而不是让整个程序失败。

8.2按自己的方式出错

8.2.1raise语句

为了引发异常,可以使用一个类(可以是Exception的子类)或者实例参数调用raise语句。

raise Exception
 
Traceback (mostrecent call last):
  File "<pyshell#0>", line 1,in <module>
    raise Exception
Exception
>>> raiseException(‘a exception happened‘)
 
Traceback (mostrecent call last):
  File "<pyshell#1>", line 1,in <module>
    raise Exception(‘a exception happened‘)
Exception: aexception happened


第一个例子引发了一个没有任何错误信息的普通异常,后一个例子中则添加了一些错误信息。

8.2.2自定义异常类

     就像其他类一样,只要确保从Exception类继承,那么编写一个自定义异常类基本上就像下面那样:

 8.3捕捉异常

     为了捕捉异常并且做一些错误处理,可以这样写程序:

>>> x=1
>>> y=0
 
 
>>>
try:
    x/y
exceptZeroDivisionError:
    print ("can not division 0")
   
   
can not division 0


如果捕捉到了一个异常,又想重新引发它那,那么可以调用不带参数的raise。 通过这一点也可以实现一种屏蔽功能,例如ZeroDivisionError,在功能激活时屏蔽这个异常。

下面是这样一个类的代码:

    

 classMuffledCalculator:
   run=False
   def calc(self,expr):
       try:
           return eval(expr)
       except ZeroDivisionError:
           if self.run:
                print("somethingwrong")
           else:
                raise

用法实例:

a=MuffledCalculator()
>>> a.calc(‘10/2‘)
5
>>> a.calc(‘10/0‘)
 
Traceback (most recent call last):
 File "<pyshell#5>", line 1, in <module>
   a.calc(‘10/0‘)
 File "C:\Users\LTianchao\Desktop\python\5.py", line 5, in calc
   return eval(expr)
 File "<string>", line 1, in <module>
ZeroDivisionError: integer division ormodulo by zero
>>> a.run=True
>>> a.calc(‘10/0‘)
something wrong


8.4 不止一个except语句

     可以在同一个try/except语句后加另一个except语句:

    

 class MuffledCalculator:
    run=False
    def calc(self,expr):
        try:
            return eval(expr)
        except ZeroDivisionError:
            if self.run:
                print("somethingwrong")
            else:
                raise
        except TypeError:
           print("somethin wrong")

8.5也可以用同一个块捕捉多个异常

   如果需要使用一个块捕捉多个异常,那么可以将它们作为元祖列出:

   

try:
    x=input()
    y=input()
    print(x/y)
except(ZeroDivisionError,TypeError):
print("something is wrong")

8.6捕捉对象

   如果想在except中访问异常对象本身:比如希望程序继续执行,又想把异常记录下来:

 

   try:
    x=int(input())
    y=int(input())
    print(eval(‘x/y‘))
except(ZeroDivisionError,TypeError)as e:
print(e)
 
>>>
1
0
division by zero

8.7真正的全捕捉

     在except子句中忽略所有异常类,就可以捕捉所有异常

try:
    x=int(input())
    y=int(input())
    print(eval(‘x/y‘))
except:
print("something is wrong")


但是这样做非常危险,它会隐藏程序员未想到并且未做好准备处理的错误。

8.8else子句

   

while True:
    try:
        x=int(input())
        y=int(input())
        print(x/y)
    except:
        print("please input again")
    else:
        break
>>>
1
0
please input again
1
1
1.0

8.9最后。。

   最后,是finally子句。他可以用来在可能的异常后进行清理。它和try语句联合使用:

x=None
try:
    x=1/0
finally:
    print("clean up")
del x

小结

    异常对象

    警告 

    引发异常

    自定义异常类

    捕捉异常

    else子句

    finally

 

 

   

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。