错误处理:
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误的代码,这样,就可以知道是否有错,
以及出错的原因。
在操作系统提供的调用中,返回错误码非常常见。
def fun1(a):
return a*3
def foo():
r = some_function()
if r==(-1):
return (-1)
else:
# do something
return r
print fun1('aa')
def fun1(a):
return a-2
def foo(a):
r = fun1(a)
if r==(-1):
return (-1)
else:
# do something
return r
print fun1(1)
print '--------------'
print foo(30)
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
-1
--------------
28
try:
让我们用一个例子来看看try的机制:
------------------------------------------------
try:
print 'try...'
r = 10 / 0
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
finally:
print 'finally...'
print 'END'
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
try...
except: integer division or modulo by zero
finally...
END
try:
print 'try...'
r = 10 / 5
print 'result:', r
except ZeroDivisionError, e:
print 'except:', e
finally:
print 'finally...'
print 'END'
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
try...
result: 2
finally...
END
def foo(s):
return 10 / int(s)
def bar(s):
return foo(0) * 2
def main():
try:
bar('0')
except StandardError, xx:
print 'Error!'
finally:
print 'finally...'
main()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
Error!
finally
调用堆栈:
# err.py:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 11, in <module>
main()
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 9, in main
bar('0')
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 6, in bar
return foo(s) * 2
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 3, in foo
return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
Process finished with exit code 1
------------------------------------------------------------------------
# err.py:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar('0')
main()
print 'xxxxxxxxxxxxxx'
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 11, in <module>
main()
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 9, in main
bar('0')
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 6, in bar
return foo(s) * 2
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 3, in foo
return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
Process finished with exit code 1
# err.py:
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except StandardError, e:
logging.exception(e)
main()
print 'xxxxxxxxxxxxxx'
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a3.py
xxxxxxxxxxxxxx
ERROR:root:integer division or modulo by zero
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 11, in main
bar('0')
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 7, in bar
return foo(s) * 2
File "C:/Users/TLCB/PycharmProjects/untitled/a3.py", line 4, in foo
return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
Process finished with exit code 0
抛出错误:
因为错误是class,捕获一个错误就是捕获到该class的一个实例。
因此,错误并不是凭空产生的,而是有意创建并抛出的。
如果要抛出错误,首先根据需要,定义一个错误的class,选择好继承关系,
然后,用raise语句抛出一个错误的实例:
# err.py
class FooError(StandardError):
def __init__(self):
def foo(self,s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
-----------------------------------------------------------
# err.py
class FooError(StandardError):
def __init__(self):
print 11
def foo(self, s):
n = int(s)
if n == 0:
raise FooError('invalid value: %s' % s)
return 10 / n
from mycompany.web.FooError import *
s=FooError()
print s.foo(5)
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a2.py
11
2
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a2.py
11
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/a2.py", line 3, in <module>
print s.foo(0)
File "C:UsersTLCBPycharmProjectsuntitledmycompanywebFooError.py", line 8, in foo
raise FooError('invalid value: %s' % s)
TypeError: __init__() takes exactly 1 argument (2 given)
最后,我们来看另一种错误处理的方式;
def foo(s):
n = int(s)
return 10 / n
def bar(s):
try:
return foo(s) * 2
except StandardError, e:
print 'Error!'
raise
def main():
bar('0')
main()
def foo(s):
n = int(s)
return 10 / n
def bar(s):
try:
return foo(s) * 2
except StandardError, e:
print 'Error!'
raise
def main():
bar('0')
main()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/a4.py
Error!
Traceback (most recent call last):
File "C:/Users/TLCB/PycharmProjects/untitled/a4.py", line 15, in <module>
main()
File "C:/Users/TLCB/PycharmProjects/untitled/a4.py", line 13, in main
bar('0')
File "C:/Users/TLCB/PycharmProjects/untitled/a4.py", line 7, in bar
return foo(s) * 2
File "C:/Users/TLCB/PycharmProjects/untitled/a4.py", line 3, in foo
return 10 / n
ZeroDivisionError: integer division or modulo by zero