Python 用异常对象来表示异常,遇到错误会引发异常程序回溯。python已经建立了许多的异常类方法,用户自己也建立自己异常类型
8.2.1 raise语句
如果不是继承的Exception的类或方法,想处理异常就需要借助raise语句
>>> raise "The information of error"
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
raise "The information of error"
TypeError: exceptions must be old-style classes or derived from BaseException, not str
>>>
>>> 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__']
8.3 捕捉异常
>>> x = input()
10
>>> y = input()
0
>>> try:
z=x/y
print z
except ZeroDivisionError:
print "The num is zero!!!"
The num is zero!!!
屏蔽异常
class MuffledCalculator:
muffled = False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'illegal divided by zero'
else:
raise
z = MuffledCalculator()
z.muffled = True
print z.calc("6/0")
z.muffled = False
print z.calc("6/0")
>>>
illegal divided by zero
None
Traceback (most recent call last):
File "G:/New Knowledge/practice/python/test.py", line 16, in <module>
print z.calc("6/0")
File "G:/New Knowledge/practice/python/test.py", line 5, in calc
return eval(expr)
File "<string>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
class MuffledCalculator:
muffled = False
def calc(self,expr):
try:
return eval(expr)
except ZeroDivisionError:
if self.muffled:
print 'illegal divided by zero'
else:
raise
except (TypeError,NameError),e:
print e
z = MuffledCalculator()
z.muffled = True
print z.calc("6/0")
z.muffled = False
print z.calc("7/3")
print z.calc("count")
>>>
illegal divided by zero
None
2
name 'count' is not defined
None
>>>
def cal(x,y):
try:
print x/y
except NameError:
print "unknown name"
except ZeroDivisionError:
print 'zero divided'
else:
print "go on well"
finally:
print "cleaning up"
>>> cal(4,3)
1
go on well
cleaning up
>>> cal(4,0)
zero divided
cleaning up
>>> cal('3','sd')
cleaning up
Traceback (most recent call last):
File "<pyshell#47>", line 1, in <module>
cal('3','sd')
File "<pyshell#43>", line 3, in cal
print x/y
TypeError: unsupported operand type(s) for /: 'str' and 'str'
>>>
异常传递:
def faulty():
raise Exception('Someting is wrong!!!')
def ignore_exception():
faulty()
def handle_exception():
try:
faulty()
except:
print 'error in handle'
handle_exception()
ignore_exception()
error in handle
Traceback (most recent call last):
File "G:/New Knowledge/practice/python/test.py", line 12, in <module>
ignore_exception()
File "G:/New Knowledge/practice/python/test.py", line 4, in ignore_exception
faulty()
File "G:/New Knowledge/practice/python/test.py", line 2, in faulty
raise Exception('Someting is wrong!!!')
Exception: Someting is wrong!!!
>>>
8.11 运用异常:
def describePerson1(person):
print "Description of ",person['name']
print 'age:%(age)s'%person
if 'Occupation' in person:
print 'Occupation:%(Occupation)s'%person
def describePerson2(person):
print "Description of ",person['name']
print 'age:%(age)s'%person
try:
print 'Occupation:%(Occupation)s'%person
except:pass
d = {'name':'John','age':15,'Occupation':'student'}
t = {'name':'John','age':15}
describePerson1(d)
describePerson1(t)
describePerson2(d)
describePerson2(t)
使用异常,效率更高
>>>
Description of John
age:15
Occupation:student
Description of John
age:15
Description of John
age:15
Occupation:student
Description of John
age:15
>>>