python学习笔记(9)

python异常

 

python用异常对象(exception object)来表示异常情况。遇到错误后,会引发异常。如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误信息)终止执行:

复制代码
>>> 1/0

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero
复制代码

 

 

raise 语句

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

复制代码
>>> raise Exception    #引发一个没有任何错误信息的普通异常

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise Exception
Exception
>>> raise Exception('hyperdrive overload')   # 添加了一些异常错误信息

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise Exception('hyperdrive overload')
Exception: hyperdrive overload
复制代码

 

系统自带的内建异常类:

复制代码
>>> import exceptions
>>> dir(exceptions)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'EnvironmentError', 'Exception', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__doc__', '__name__', '__package__']
复制代码

哇!好多,常用的内建异常类:

 

 

自定义异常

尽管内建的异常类已经包括了大部分的情况,而且对于很多要求都已经足够了,但有些时候还是需要创建自己的异常类。

和常见其它类一样----只是要确保从Exception类继承,不管直接继承还是间接继承。像下面这样:

>>> class someCustomExcetion(Exception):pass

当然,也可以为这个类添加一些方法。

 

 

捕捉异常

我们可以使用 try/except 来实现异常的捕捉处理。

假设创建了一个让用户输入两个数,然后进行相除的程序:

复制代码
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y

#运行并且输入
Enter the first number: 10
Enter the second number: 0

Traceback (most recent call last):
  File "I:/Python27/yichang", line 3, in <module>
    print x/y
ZeroDivisionError: integer division or modulo by zero
复制代码

 

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

复制代码
try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except ZeroDivisionError:
  print "输入的数字不能为0!"
  
#再来云行
>>> 
Enter the first number: 10
Enter the second number: 0
输入的数字不能为0!           #怎么样?这次已经友好的多了
复制代码

假如,我们在调试的时候引发异常会好些,如果在与用户的进行交互的过程中又是不希望用户看到异常信息的。那如何开启/关闭 “屏蔽”机制?

复制代码
class MuffledCalulator:
    muffled = False   #这里默认关闭屏蔽
    def calc(self,expr):
        try:
            return eval(expr)
        except ZeroDivisionError:
            if self.muffled:
                print 'Divsion by zero is illagal'
            else:
                raise

#运行程序:
>>> calculator = MuffledCalulator()
>>> calculator.calc('10/2')
5
>>> calculator.clac('10/0')

Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    calculator.clac('10/0')
AttributeError: MuffledCalulator instance has no attribute 'clac'   #异常信息被输出了

>>> calculator.muffled = True   #现在打开屏蔽
>>> calculator.calc('10/0')
Divsion by zero is illagal 
复制代码

 

 

多个except 子句

如果运行上面的(输入两个数,求除法)程序,输入面的内容,就会产生另外一个异常:

复制代码
try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except ZeroDivisionError:
  print "输入的数字不能为0!"
  
#运行输入:
>>> 
Enter the first number: 10
Enter the second number: 'hello.word'  #输入非数字

Traceback (most recent call last):
  File "I:\Python27\yichang", line 4, in <module>
    print x/y
TypeError: unsupported operand type(s) for /: 'int' and 'str'  #又报出了别的异常信息
复制代码

 

好吧!我们可以再加个异常的处理来处理这种情况:

复制代码
try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except ZeroDivisionError:
    print "输入的数字不能为0!"
except TypeError:           # 对字符的异常处理
  print "请输入数字!"
  
#再来运行:
>>> 
Enter the first number: 10
Enter the second number: 'hello,word'
请输入数字!
复制代码

 

 

一个块捕捉多个异常

我们当然也可以用一个块来捕捉多个异常:

复制代码
try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except (ZeroDivisionError,TypeError,NameError):
    print "你的数字不对!"
复制代码

 

 

捕捉全部异常

就算程序处理了好几种异常,比如上面的程序,运行之后,假如我输入了下面的内容呢

复制代码
>>> 
Enter the first number: 10
Enter the second number:   #不输入任何内容,回车

Traceback (most recent call last):
  File "I:\Python27\yichang", line 3, in <module>
    y = input('Enter the second number: ')
  File "<string>", line 0
    
   ^
SyntaxError: unexpected EOF while parsing
复制代码

 

晕死~! 怎么办呢?总有被我们不小心忽略处理的情况,如果真想用一段代码捕捉所有异常,那么可在except子句中忽略所有的异常类:

复制代码
try:
    x = input('Enter the first number: ')
    y = input('Enter the second number: ')
    print x/y
except:
    print '有错误发生了!'

#再来输入一些内容看看
>>> 
Enter the first number: 'hello' * )0 
有错误发生了!
复制代码

 

 

结束

别急!再来说说最后一个情况,好吧,用户不小心输入了错误的信息,能不能再给次机会输入?我们可以加个循环,保你输对时才结束:

复制代码
while True:
    
    try:
        x = input('Enter the first number: ')
        y = input('Enter the second number: ')
        value = x/y
        print 'x/y is',value
        break
    except:
        print '列效输入,再来一次!'

#运行
>>> 
Enter the first number: 10
Enter the second number: 
列效输入,再来一次!
Enter the first number: 10
Enter the second number: 'hello'
列效输入,再来一次!
Enter the first number: 10
Enter the second number: 2
x/y is 5
复制代码

 

阅读更多
文章标签: python
个人分类: python
上一篇python学习笔记(8)
下一篇python学习笔记(10)
想对作者说点什么? 我来说一句

Python学习笔记

2010年02月23日 596KB 下载

python学习笔记

2018年04月24日 906KB 下载

python 学习笔记资料

2018年01月23日 1.67MB 下载

pyhthon学习笔记

2017年10月30日 41KB 下载

Python 学习笔记

2016年05月22日 1.49MB 下载

python资料大全

2009年01月13日 12.55MB 下载

Python核心编程笔记

2015年02月25日 692KB 下载

没有更多推荐了,返回首页

关闭
关闭